【发布时间】:2013-05-13 17:14:26
【问题描述】:
我有一个具有 1+N 个线程和 N 个 FIFO 队列的程序,例如:FIFO_queue_t* fifo_queque[N]。 一个线程负责填充这 N 个 FIFO 队列。 并且每个其他线程都与 1 个 FIFO 队列相关。
对于其他每个线程 i ,它会不断检查其 FIFO 队列 fifo_queue[i] 是否为空,如果不为空,则从 fifo_queue 中取出所有元素,并使 fifo_queue 再次为空。
现在的问题是如何进行检查(如果您愿意,也可以进行轮询)。一种方法是
for(;;)
{
if(fifo_queue[i] != NULL)
{
fetch_all_element();
}
}
这样,会不会很耗CPU? 所以另一种方法是使用 pthread_cond_t 变量,
for(;;){
pthread_mutex_lock(&mut);
if(fifo_queue[i] == NULL) {
pthread_cond_wait(&cond, &mut);
fetch_all_element();
}
pthread_mutex_unlock(&mut);
}
但是这样,我需要为 N 个线程创建 N 个条件变量和互斥体。 是不是很耗资源? 有没有好的方法可以在这种情况下阻塞线程直到它被满足? 谢谢!
【问题讨论】:
-
如果你想轮询,就像在第一个循环中一样,你应该添加一些类型的延迟,比如 sleep(1) 或者我们合适的任何延迟,这样它就不会占用太多的 CPU。如果您不能容忍任何延迟,您将需要从写入线程添加某种信号到读取线程。也许是一个信号量
-
pthreads 库有信号量。见linux.die.net/man/7/sem_overview
-
那我还需要创建N个信号量吗?是信号量更消耗资源还是线程条件变量更消耗时间?
标签: c multithreading mutex