我正在实现一个包含任务队列的线程.第一个任务添加到队列后,线程就会开始运行它.
我应该使用pthread条件变量来唤醒线程还是有更合适的机制?
如果我pthread_cond_signal()
在其他线程没有被阻止pthread_cond_wait()
而是做某事时调用,会发生什么?信号会丢失吗?
如果你的队列已经是线程安全的,那么信号量是好的,如果只有.此外,一些信号量实现可能受到最高计数器值的限制.即使你不太可能超过最大值.
最简单和正确的方法是:
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_signal手册:
如果cond上当前没有阻塞线程,则pthread_cond_broadcast()和pthread_cond_signal()函数将不起作用.
我建议你使用信号量.基本上,每次在队列中插入任务时,都会"提升"信号量.工作线程通过"向下"来阻塞信号量.由于每个任务都会"up"一次,所以只要队列中有任务,工作线程就会继续运行.当队列为空时,信号量为0,工作线程阻塞,直到新任务到达.当工作人员忙碌时,当超过1个任务到达时,信号量也很容易处理.请注意,您仍然必须锁定对队列的访问以保持插入/删除原子.