linux 线程同步
时间:2011-08-16
来源:互联网
这是unix环境高级编程这本书中一段话,第11章 线程 11.6线程同步
程序清单11-9 使用条件变量
#include<pthread.h>
struct msg{
struct msg *m_next;
};
struct msg *workq;
pthread_cond_t qready = PTHREAD_COND_INITIALIZER;
pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;
void process_msg(void){
struct msg *mp;
for(;;){
pthread_mutex_lock(&qlock);
while(workq == NULL)
pthread_cond_wait(&qready,&qlock);
mp = workq;
workq = mp->m_next;
pthread_mutex_unlock(&qlock);
}
}
void enqueue_msg(struct msg *mp){
pthread_mutex_lock(&qlock);
mp->m_next = workq;
workq = mp;
pthread_mutex_unlock(&qlock);
pthread_cond_signal(&qready);
}
条件是工作队列的状态。用互斥量保护条件,在while循环中判断条件。把消息放到工作队列时,需要占有互斥量,但向等待线程发送信号时并不需要占有互斥量。(到这里都能理解,下面的就不理解了)只要线程可以在调用cond_signal之前把消息从队列中拖出,就可以在释放互斥量以后再完成这部分工作。(这里的“这部分工作”,是哪部分工作)因为是在while循环中检查条件,所有不会存在问题:线程醒来,发现队列仍为空,然后返回继续等待。如果代码不能容忍这种竞争,就需要在向线程发送信号的时候占有互斥量。(后两句不能理解)
这是书中原话,标点都一模一样,请各位前辈帮小弟解释一下不能理解的地方,谢谢!!
程序清单11-9 使用条件变量
#include<pthread.h>
struct msg{
struct msg *m_next;
};
struct msg *workq;
pthread_cond_t qready = PTHREAD_COND_INITIALIZER;
pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;
void process_msg(void){
struct msg *mp;
for(;;){
pthread_mutex_lock(&qlock);
while(workq == NULL)
pthread_cond_wait(&qready,&qlock);
mp = workq;
workq = mp->m_next;
pthread_mutex_unlock(&qlock);
}
}
void enqueue_msg(struct msg *mp){
pthread_mutex_lock(&qlock);
mp->m_next = workq;
workq = mp;
pthread_mutex_unlock(&qlock);
pthread_cond_signal(&qready);
}
条件是工作队列的状态。用互斥量保护条件,在while循环中判断条件。把消息放到工作队列时,需要占有互斥量,但向等待线程发送信号时并不需要占有互斥量。(到这里都能理解,下面的就不理解了)只要线程可以在调用cond_signal之前把消息从队列中拖出,就可以在释放互斥量以后再完成这部分工作。(这里的“这部分工作”,是哪部分工作)因为是在while循环中检查条件,所有不会存在问题:线程醒来,发现队列仍为空,然后返回继续等待。如果代码不能容忍这种竞争,就需要在向线程发送信号的时候占有互斥量。(后两句不能理解)
这是书中原话,标点都一模一样,请各位前辈帮小弟解释一下不能理解的地方,谢谢!!
作者: wanchangjiu123 发布时间: 2011-08-16
这部分工作,是不是指cond_signal
后面讨论的应该就是下面两句话的先后顺序问题
pthread_mutex_unlock(&qlock);
pthread_cond_signal(&qready);
后面讨论的应该就是下面两句话的先后顺序问题
pthread_mutex_unlock(&qlock);
pthread_cond_signal(&qready);
作者: justkk 发布时间: 2011-08-16
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28