【问题标题】:is it reasonable/sensible to create many thread condition variables and mutexes?创建许多线程条件变量和互斥锁是否合理/明智?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我不明白你的意思。如何向其他 N 线程发出信号?定义 N 个不同的信号?
  • 是的,你可以定义 N 个不同的信号。
  • 你确定吗?不是只有 2 个用户定义的信号吗?
  • 我其实不知道。我必须深入挖掘才能得到绝对的答案。基本上,您想向运行相同方法的各个线程发出信号吗?
【解决方案2】:

我正在从事一个听起来与您正在做的事情非常相似的项目。 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;
}

【讨论】:

  • 那我还需要创建N个信号量吗?是信号量更消耗资源还是线程条件变量更消耗时间?
  • @misteryes - 这将取决于您在程序中尝试执行的操作。如果您尝试让 1 个线程为队列生成条目并让 N 个线程从队列中提取数据,那么您将不需要 N 个信号量。如果由于某种原因您不能让每个线程都指向同一个队列,那么您可能需要为每个线程设置 1 个队列。
  • 条目有N种类型,每种类型对应一个线程。如果我将所有条目放在一个队列中。那么如何安排N个线程的数据拉取呢?
猜你喜欢
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 2010-11-06
  • 2018-03-09
  • 2018-10-06
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
相关资源
最近更新 更多