当前位置:  开发笔记 > 程序员 > 正文

pthread条件变量

如何解决《pthread条件变量》经验,为你挑选了2个好方法。

我正在实现一个包含任务队列的线程.第一个任务添加到队列后,线程就会开始运行它.

我应该使用pthread条件变量来唤醒线程还是有更合适的机制?

如果我pthread_cond_signal()在其他线程没有被阻止pthread_cond_wait()而是做某事时调用,会发生什么?信号会丢失吗?



1> 小智..:

如果你的队列已经是线程安全的,那么信号量是好的,如果只有.此外,一些信号量实现可能受到最高计数器值的限制.即使你不太可能超过最大值.

最简单和正确的方法是:

pthread_mutex_t queue_lock;
pthread_cond_t  not_empty;
queue_t queue;

push()
{
  pthread_mutex_lock(&queue_lock);
  queue.insert(new_job);
  pthread_cond_signal(¬_empty)
  pthread_mutex_unlock(&queue_lock);
}
pop()
{
  pthread_mutex_lock(&queue_lock);
  if(queue.empty()) 
     pthread_cond_wait(&queue_lock,¬_empty);
  job=quque.pop();
  pthread_mutex_unlock(&queue_lock);
}


`pthread_cond_wait`可以虚假返回,所以`pop()`中的`if`应该是`while`.
此外,`pthread_cond_wait`的参数可能是错误的顺序 - 对条件的引用应该是第一个,第二个是锁定.

2> Joao da Silv..:

从pthread_cond_signal手册:

如果cond上当前没有阻塞线程,则pthread_cond_broadcast()和pthread_cond_signal()函数将不起作用.

我建议你使用信号量.基本上,每次在队列中插入任务时,都会"提升"信号量.工作线程通过"向下"来阻塞信号量.由于每个任务都会"up"一次,所以只要队列中有任务,工作线程就会继续运行.当队列为空时,信号量为0,工作线程阻塞,直到新任务到达.当工作人员忙碌时,当超过1个任务到达时,信号量也很容易处理.请注意,您仍然必须锁定对队列的访问以保持插入/删除原子.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有