2

我有一个被多个 pthreads 使用的队列结构。如果队列不为空,线程应该从队列中出列,然后执行它们的业务。

我最初将此设置为一个while循环,其中线程使用互斥锁检查队列是否为空。不幸的是,这让我的程序慢了下来。

我尝试将信号量实现为队列的“计数”变量,但不幸的是,当我尝试调用 sem_wait() 时遇到了段错误。我发现 gdb 和 semaphore.h 不能很好地结合在一起,所以我真的很茫然。我可能会犯一个新手错误,所以任何帮助或建议将不胜感激。

队列结构:

typedef struct {
  int q[QUEUESIZE+1];
  int first;
  int last;
  sem_t count;
} queue;

这是它的初始化:

queue *CreateQueue(void)
{
  queue *q;
  q = (queue*)malloc(sizeof(queue));
  if (q == NULL)
    return NULL;
  q->first = 0;
  q->last = 0;
  sem_init(&(q->count),0, 0);

}

我确保我打电话给:

   queue *q;
    q = CreateQueue();

在创建任何线程之前。

这是段错误的调用

void *ThreadWait(void *t) {
  while(1) {
    sem_wait(&(q->count));  //THIS SEGFAULTS
    ThreadFun(); //this is the function the thread would go to to do all the work
  }
}

我希望这只是我现在看不到的一个简单错误。

提前致谢。

编辑:添加一些澄清代码

4

1 回答 1

3

如果CreateQueue上面的例子是完整的,那么它似乎没有设置你的全局q变量。它将结果分配给局部变量。但它似乎没有返回变量。

于 2010-03-29T20:16:31.453 回答