我正在实现一个包含任务队列的线程.第一个任务添加到队列后,线程就会开始运行它.
我应该使用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(¬_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);
}
Run Code Online (Sandbox Code Playgroud)