linux线程同步方式
来源:互联网 发布:资海网络集团 编辑:程序博客网 时间:2024/06/03 18:01
linux线程的同步有以下三种
1.互斥锁
(1)初始化锁。在Linux下,线程的互斥量数据类型是pthread_mutex_t。在使用前,要对它进行初始化。
静态分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
动态分配:int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr_t *mutexattr);
(2)加锁。对共享资源的访问,要对互斥量进行加锁,如果互斥量已经上了锁,调用线程会阻塞,直到互斥量被解锁。
int pthread_mutex_lock(pthread_mutex *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex)
(3)解锁。在完成了对共享资源的访问后,要对互斥量进行解锁。
int pthread_mutex_unlock(pthread_mutex_t *mutex);
(4)销毁锁。锁在是使用完成后,需要进行销毁以释放资源。
int pthread_mutex_destroy(pthread_mutex *mutex);
2.条件变量
条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。
初始化条件变量。
静态态初始化,pthread_cond_t cond = PTHREAD_COND_INITIALIER;
动态初始化,int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
等待条件成立。释放锁,同时阻塞等待条件变量为真才行。timewait()设置等待时间,仍未signal,返回ETIMEOUT(加锁保证只有一个线程wait)
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);
激活条件变量。pthread_cond_signal,pthread_cond_broadcast(激活所有等待线程)
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond); //解除所有线程的阻塞
清除条件变量。无线程等待,否则返回EBUSY
int pthread_cond_destroy(pthread_cond_t *cond);
3.信号量
信号量是一个非负整数,所有通过它的线程/进程都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。在信号量上我们定义两种操作: Wait(等待) 和 Release(释放)。当一个线程调用Wait操作时,它要么得到资源然后将信号量减一,要么一直等下去(指放入阻塞队列),直到信号量大于等于一时。Release(释放)实际上是在信号量上执行加操作,该操作之所以叫做“释放”是因为释放了由信号量守护的资源。
信号量可用于进程和线程的同步
- linux线程同步方式
- 【Linux开发】linux线程同步方式互斥锁介绍及实例
- 【Linux开发】linux线程同步方式信号量介绍及实例
- linux 线程 线程同步
- 线程的同步方式
- 线程同步的方式
- 线程间同步方式
- 线程同步方式汇总
- Windows线程同步方式
- 线程同步方式
- 线程同步的方式
- Linux多进程和线程同步的几种方式
- 用户方式中线程同步
- 线程同步三种方式
- 线程同步的多种方式
- 黑马程序员------线程同步方式
- 线程同步四种方式
- 三种线程同步方式
- JavaScript的function获取AngularJS的$scope对象
- Lucene学习二:封装操作接口,实现删除、更新索引
- 2路万兆光纤PCIE x8FPGA-k7处理板
- CI Weekly #7 | Instgram/Quora 等大公司如何做持续部署
- cannot remove `libtoolT': No such file or directory
- linux线程同步方式
- Ubuntu 下 su:authentication failure的解决办法
- 多线程编程(三)
- leetcode598. Range Addition II降维
- TCP 用select 监听带外数据(MSG_OOB)
- html2canvas把div保存图片高清图
- 判断等价试
- web.xml中webAppRootKey
- my eclipse 安装方编译插件