linux 线程同步

wanchangjiu123 2011-08-16 05:12:15
这是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循环中检查条件,所有不会存在问题:线程醒来,发现队列仍为空,然后返回继续等待。如果代码不能容忍这种竞争,就需要在向线程发送信号的时候占有互斥量。(后两句不能理解)

这是书中原话,标点都一模一样,请各位前辈帮小弟解释一下不能理解的地方,谢谢!!
...全文
142 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
kevin_zlg 2011-08-19
  • 打赏
  • 举报
回复
只要线程可以在调用cond_signal之前把消息从队列中拖出,就可以在释放互斥量以后再完成这部分工作。(这里的“这部分工作”,是哪部分工作)
其实不用这样逐字看,把pthread_cond_wait(&qready,&qlock);函数弄清楚就很好理解代码了
这部分工作是指对workq指针的操作,只是这里就一句赋值罢了,可以理解为一项具体的工作,
只要线程可以在调用cond_signal之前把消息从队列中拖出:就是说workq不为空,那么就可以释放互斥量,对workq做对应的操作。
因为有whlie循环在,所以pthread_cond_wait(&qready,&qlock);唤醒后仍然会判断workq是否为空,所以十分安全,所以这里pthread_cond_signal(&qready);执行时互斥量可以是已经解除的。
wanchangjiu123 2011-08-18
  • 打赏
  • 举报
回复
自己顶啊
wanchangjiu123 2011-08-18
  • 打赏
  • 举报
回复
高手进啊!!
wanchangjiu123 2011-08-17
  • 打赏
  • 举报
回复
自己顶一下!
wanchangjiu123 2011-08-17
  • 打赏
  • 举报
回复
请问:线程醒来,发现工作队列为空,这里的“工作队列”是干什么的,用途是什么???
wanchangjiu123 2011-08-17
  • 打赏
  • 举报
回复
只要线程可以在调用cond_signal之前把消息从队列中拖出,就可以在释放互斥量以后再完成这部分工作。(这里的“这部分工作”,是哪部分工作)因为是在while循环中检查条件,所有不会存在问题:线程醒来,发现队列仍为空,然后返回继续等待。如果代码不能容忍这种竞争,就需要在向线程发送信号的时候占有互斥量。(后两句不能理解)
天亮后说晚安 2011-08-17
  • 打赏
  • 举报
回复
工作队列:顾名思义要执行的队列表
justkk 2011-08-16
  • 打赏
  • 举报
回复
这部分工作,是不是指cond_signal

后面讨论的应该就是下面两句话的先后顺序问题
pthread_mutex_unlock(&qlock);
pthread_cond_signal(&qready);

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧