学习笔记之线程同步
来源:互联网 发布:菲诗小铺金盏花知乎 编辑:程序博客网 时间:2024/06/05 17:44
1.互斥量
静态分配互斥量初始化:(1)设置为常量PTHREAD_MUTEX_INITIALIZER;(2)调用pthread_mutex_init初始化;
动态分配互斥量初始化:调用pthread_mutex_init进行初始化。注意:释放内存前必须调用pthread_mutex_destroy.
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
互斥量加锁:
int pthread_mutex_lock(pthread_mutex_t *mutex);
互斥量解锁:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
尝试加锁:
int pthread_mutex_trylock(pthread_mutex_t *mutex);
尝试加锁时,若互斥量未被锁住,那么pthread_mutex_trylock将锁住互斥量,不会出现阻塞并返回0;若互斥量已被锁住,则不能对互斥量加锁,而返回EBUSY。
避免死锁:
当线程试图对同一互斥量加锁两次,则死锁。
当一个线程试图以与另一个线程相异的顺序锁住互斥量时,可能导致死锁。
2.读写锁
适用于对数据结构读的次数远大于写的情况下。
读写锁初始化:
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
释放锁占用的资源前,需要进行清理:
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
读模式加锁:(有必要进行返回值的检查,共享模式下可获取的锁的数量通常有上限)
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
写模式加锁:
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
解锁:
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
有条件的加锁:
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
3.条件变量
条件变量与互斥量一起使用时,允许线程以无竞争的方式等待待定的条件发生。
条件本身由互斥量保护。线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会觉察到这种改变,因为必须锁定互斥量以后才能计算条件。
条件变量初始化:
(1)静态初始化,直接赋值PTHREAD_COND_INITIALIZER;或者调用pthread_cond_init赋值;
(2)动态赋值,调用pthread_cond_init赋值.
条件变量所存放的内存空间被释放前,需调用pthread_cond_destroy去初始化。
int pthread_cond_init(pthread_cond_t *restrict cond, pthread_condattr_t *restrict attr);
int pthread_cond_destroy(pthread_cond_t *cond);
等待条件变为真:
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
int pthread_cond_timewait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict timeout);
传递给pthread_cond_wait的互斥量是被锁住的,其对条件进行保护;pthread_cond_wait返回时,互斥量将被再次锁住(期间有一次解锁)。
其中,timeout是绝对时间,不是相对时间。
获取当前绝对时间:
void gettimeofday(struct timeval *restrict ptr);//-_-|||
通知线程条件已满足:
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
注意要在改变条件状态后,才能给线程发送信号。
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- 学习笔记之线程同步
- Java线程学习笔记之线程同步
- java 多线程学习笔记之 线程同步
- 学习笔记之线程同步的函数
- 多线程开发学习笔记之线程同步——互斥量
- 多线程开发学习笔记之线程同步——信号量
- 多线程开发学习笔记之线程同步——事件
- C#多线程学习笔记(二)之线程同步
- linux多线程学习笔记三---线程同步之信号量
- 学习笔记之用户模式下的线程同步
- 学习笔记:线程间同步
- java学习笔记--线程同步
- C#学习笔记 线程同步
- 线程学习之--8线程同步
- posix线程同步和boost线程同步学习笔记
- APUE学习笔记(15)-线程同步
- JVM原理学习笔记 -- (对象线程同步)
- C++ 线程同步 (学习笔记)
- android UDP多点广播,并自动建立Socket连接
- create schema 与create database的区别
- hdu 1221 Rectangle and Circle(矩形与圆焦点问题)
- fopen函数小结
- 最短路之Dijkstra
- 学习笔记之线程同步
- windows 消息队列,消息循环,模态对话框
- apktool反编译工具使用详解
- ASP.NET Eval四种绑定方式
- linux 线程等待队列
- 在超链接中传递中文的乱码问题
- 企业信息化杂汤:信息化和基础信息化(补遗)
- Linux开机启动(bootstrap)
- 关于dijkstra