创建许多线程条件变量和互斥量是否合理/合理?

时间:2013-05-13 17:14:27

标签: c multithreading mutex

我有一个带有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个条件变量和互斥锁。 它消耗资源吗? 有没有很好的方法来阻止这种情况下的线程,直到满意为止? 谢谢!

2 个答案:

答案 0 :(得分:1)

看起来像填充队列的线程应该在填充整个队列时向其他线程发出信号。虽然所有条件变量的设置都很耗时,但是当程序超出这个初始化时,它应该运行得更快,因为你不会浪费你的N个线程的CPU时间循环。相反,1个线程将运行(填充队列的主线程),然后当它必须时,它将发出一个线程的信号,并且一个线程将开始执行。无论主线程是否继续执行,都取决于您,因为您可能需要添加更多互斥锁,以确保主线程不会在任何其他线程上进行操作。

答案 1 :(得分:0)

我正在开展一个与你正在做的非常相似的项目。 link

我所做的是创建一个线程安全队列,如果队列为空,将阻止任何尝试从队列中出队的进程,或阻止进程在队列已满时尝试入队。因此,一旦将条目添加到队列中,就会发出消耗过程的信号。这样,您不会通过轮询每个线程来浪费CPU周期。

不确定这在您的方案中是否有效,但它可能会让您了解如何解决您的问题。

编辑:这是一个可能有用的附加功能。返回'1'表示队列为空。可以在此之外创建isFull()的类似函数。

int isEmpty(Queue *q)
{
    int ret;
    sem_wait(q->excl);
    if (q->count <= 0) 
        ret = 1;
    else 
        ret = 0;
    sem_post(q->excl);
    return ret;
}