RTT之POSIX
POSIX:可移植操作系统接口,是一个标准。
创建线程:如果线程创建成功,线程立刻进入就绪态,参与系统的调度,如果线程创建失败,则会释放之前线程占有的资源
int pthread_create (pthread_t *tid, const pthread_attr_t *attr,void *(*start) (void *), void *arg);
线程解绑:如有再调用则设置为解绑状态,如果没有则释放资源int pthread_detach (pthread_t thread);
分离状态为joinable的线程仅当有其他线程对其执行了pthread_join()后,它所占用的资源才会释放。因此为了避免内存泄漏,所有会结束运行的线程,分离状态要么已设为detached,要么使用pthread_join()来回收其占用的资源。
线程退出:void pthread_exit(void *value_ptr);但此时并未释放
二 互斥锁:特殊的二值信号量:在初始化时开锁=1,开锁时刻申请,使用前闭锁(lock=0),使用后再释放(unlock=1)。初始化、销毁、阻塞和非阻塞上锁(非阻塞上锁是指如果已经上锁则立即返回)、解锁。
分为普通锁(一个申请到其它进入等待队列)、嵌套锁(上锁和解锁次数形同)、检错锁(若没解锁就申请锁,错误返回。)
三条件变量(事件或标志组):配合互斥量使用。
pthread_cond_init()对条件变量初始化
pthread_cond_destroy()销毁一个条件变量
pthread_cond_wait()等待一个条件变量
指定阻塞时间的等待条件变量
int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t *mutex,const struct timespec *abstime);
pthread_cond_signal()发送一个条件变量。 int pthread_cond_broadcast(pthread_cond_t *cond);广播形式发送条件变量
四读写锁:基于互斥锁和条件变量,适合于单写多读(同一时间只能有一个写,但同一时间可以有多个读),就如同一本书,生产和消费类型。
pthread_rwlock_init()初始化一个读写锁
pthread_rwlock_wrlock()对读写锁写锁定
pthread_rwlock_rdlock()对读写锁读锁定
pthread_rwlock_destroy()销毁
五 :屏障:
屏障是多线程同步的一种方法。基于条件变量和互斥锁实现的barrier意为屏障或者栏杆,把先后到达的多个线程挡在同一栏杆前,直到所有线程到齐,然后撤下栏杆同时放行。先到达的线程将会阻塞,等到所有调用pthread_barrier_wait()函数的线程(数量等于屏障初始化时指定的count)都到达后,这些线程才会由阻塞状态进入就绪状态再次参与系统调度。
初始化后指定的等待线程个数为count个,必须对应count个线程 调用pthread_barrier_wait()。
六信号量:分为二值信号量(互斥量)和计数器信号量
sem_init()或者sem_open()给信号量值赋初值,
sem_post()函数可以让信号量值加1,
sem_wait()可以让信号量值减1
sem_t *sem_open(const char *name, int oflag, ...);
int sem_unlink(const char *name);先检查若存在则分离,在减一=0则删除
int sem_close(sem_t *sem);减一=0则删除并释放资源
int sem_getvalue(sem_t *sem, int *sval);
int sem_wait(sem_t *sem);阻塞获取
int sem_trywait(sem_t *sem);非阻塞获取
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
int sem_post(sem_t *sem);是rt_sem_release()函数的封装
六消息队列:
mqd_t mq_open(const char *name, int oflag, ...);
int mq_close(mqd_t mqdes);
int mq_unlink(const char *name);先看存在性
int mq_send(mqd_t mqdes,const char *msg_ptr, size_t msg_len,unsigned msg_prio);
int mq_timedsend(mqd_t mqdes,const char *msg_ptr,size_t msg_len,unsigned msg_prio,const struct timespec *abs_timeout);指定时间的阻塞发送
ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio);
ssize_t mq_timedreceive(mqd_t mqdes,char *msg_ptr, size_t msg_len, unsigned *msg_prio,const struct timespec *abs_timeout);
七线程属性:使用时要在线程创建之前创建线程属性对象。
线程的分离状态决定一个线程以什么样的方式来回收自己运行结束后占用的资源。线程的分离状态有2种:joinable或者detached。分离状态为detached的线程不能被其他的线程所join,自己运行结束后,马上释放系统资源
线程2中调用pthread_join(tid1,NULL);表示阻塞等待线程1结束(因接受到线程取消而结束自己运行)
7.1调度策略:int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy); int pthread_attr_getschedpolicy(pthread_attr_t const *attr, int *policy);
7.2设置调度优先级:int pthread_attr_setschedparam(pthread_attr_t *attr, struct sched_param const *param); int pthread_attr_getschedparam(pthread_attr_t const *attr, struct sched_param *param);
7.3设置线程堆栈的大小:int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stack_size); int pthread_attr_getstacksize(pthread_attr_t const *attr, size_t *stack_size);
int pthread_attr_setstack(pthread_attr_t *attr, void *stack_base, size_t stack_size); int pthread_attr_getstack(pthread_attr_t const *attr, void **stack_base, size_t *stack_size);
7.4获取堆栈地址:int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stack_addr); int pthread_attr_getstackaddr(pthread_attr_t const *attr, void **stack_addr);
7.5线程作用域:int pthread_attr_getscope(pthread_attr_t const *attr);int pthread_attr_setscope(pthread_attr_t *attr, int scope);
7.6线程取消机制:请求取消线程的执行。当线程设置了自己的取消使能及取消状态,在别的线程发给自己取消线程时就可以执行取消动作。
int pthread_cancel(pthread_t thread);
int pthread_setcancelstate(int state, int *oldstate);
int pthread_setcanceltype(int type, int *oldtype);
void pthread_testcancel(void);取消点也就是线程接受取消请求后会结束运行的地方
八线程结束后的清理:
void pthread_cleanup_pop(int execute);把指定的清理函数routine放到线程的清理函数链表里,
void pthread_cleanup_push(void (*routine)(void*), void *arg);从清理函数链表头部取出第一项函数,若execute为非0值,则执行此函数
int pthread_equal (pthread_t t1, pthread_t t2);线程是否相等
pthread_t pthread_self (void);获取调用线程的句柄。
RTT之POSIX的更多相关文章
- Linux posix线程库总结
由于历史原因,2.5.x以前的linux对pthreads没有提供内核级的支持,所以在linux上的pthreads实现只能采用n:1的方式,也称为库实现. 线程的实现,经历了如下发展阶段: Linu ...
- 003:Posix IPC的消息队列
1:与FIFO相比,FIFO要求对一个管道写入之前,必须有进程进行读打开.消息队列则不需要有进行在队列上等待消息的到达. 2:POSIX每次读取总是返回优先级最高的,system V则可以返回任意优先 ...
- POSIX正则表达式
POSIX正则表达式规范 参考:http://en.wikipedia.org/wiki/Regular_expression POSIX正则表达式分为Basic Regular Expression ...
- C语言学习笔记(二)_system系统调用及posix说明
1.9 System系统调用 System库函数的功能是执行操作系统的命令或者运行指定的程序.system库函数的调用需要#include<stdlib.h>这个头文件. #include ...
- Linux IPC POSIX 消息队列
模型: #include<mqueue.h> #include <sys/stat.h> #include <fcntl.h> mq_open() //创建/获取消 ...
- POSIX, Bash, GPL etc
POSIX , SUS, XSI Portable Operating System Interface POSIX是给Unix/Linux系统使用的通用调用接口(SCI, System Call I ...
- 解析posix与perl标准的正则表达式区别 ---PHP
正则表达式(Regular Expression,缩写为regexp,regex或regxp),又称正规表达式.正规表示式或常规表达式或正规化表示法或正规表示法,是指一个用 来描述或者匹配一系 ...
- Posix消息队列
转载于:http://blog.csdn.net/zx714311728/article/details/53197196 1.消息队列 消息队列可以认为是一个消息链表,消息队列是随内核持续的.队列中 ...
- 第二章:Posix IPC
2.1:概述 以下三种类型的IPC合称为“Posix IPC”: Posix消息队列 Posix信号量 Posix共享内存区 Posix IPC在访问它们的函数和描述它们的信息上有一些类似点.本章讲述 ...
随机推荐
- sublime 配置 anaconda 环境
安装清单: 软件列表: anaconda sublime text sublime插件列表: package control Conda 安装 anaconda https://www.continu ...
- Postman工具---请求与响应
参考:http://blog.csdn.net/water_0815/article/details/53311561
- 查看类属性和方法---structure
- repo的一些用法
repo的用法注:repo只是google用Python脚本写的调用git的一个脚本,主要是用来下载.管理Android项目的软件仓库.(也就是说,他是用来管理给git管理的一个个仓库的) 1.下载r ...
- HTML5与CSS3设计模式 中文版 高清PDF扫描版
HTML5与CSS3设计模式是一部全面讲述用HTML5和CSS3设计网页的教程.书中含350个即时可用的模式 (HTML5和CSS3代码片段),直接复制粘贴即可使用,更可以组合起来构建出无穷的解决方案 ...
- Redis实现用户关注功能
最近项目要涉及到粉丝关注问题,权衡再三还是使用Redis实现比较方便,使用Redis的有序集合可以做到根据关注的时间有序的取出列表,假设我的ID是me,别人的ID是other. 1. 添加关注 添加关 ...
- linux linux系统的安装及使用
linux linux系统的安装及使用 一.linux系统中安装vm-tools工具: 步骤: 1.在vmware workstation软件中:虚拟机-安装vmware-tools-状态栏会提示- ...
- 常用SQL语句及在node中使用MySQL
摘要:一些重要的SQL命令 SELECT - 从数据库中提取数据 UPDATE - 更新数据库中的数据 DELETE - 从数据库中删除数据 INSERT INTO - 向数据库中插入新数据 CREA ...
- web安全-xss攻击
web安全问题 xss攻击 1.html标签 html内容的转义 escapeHtml str = str.replace(/&/g,'&'); str = str.replac ...
- String s String s=null和String s="a"区别
原文链接:https://www.cnblogs.com/ipetergo/p/6826909.htmlString s;和String s=null;和String s="a"; ...