pthread条件变量

jac*_*hab 8 pthreads

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

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

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

小智 12

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

最简单和正确的方法是:

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(&not_empty)
  pthread_mutex_unlock(&queue_lock);
}
pop()
{
  pthread_mutex_lock(&queue_lock);
  if(queue.empty()) 
     pthread_cond_wait(&queue_lock,&not_empty);
  job=quque.pop();
  pthread_mutex_unlock(&queue_lock);
}
Run Code Online (Sandbox Code Playgroud)

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

Joa*_*lva 11

pthread_cond_signal手册:

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

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