【问题标题】:Problem with semaphores and sem_wait()信号量和 sem_wait() 的问题
【发布时间】:2010-03-29 19:44:17
【问题描述】:

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

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

我尝试将信号量实现为队列的“计数”变量,但不幸的是,当我尝试调用 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
  }
}

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

提前致谢。

编辑:添加一些澄清代码

【问题讨论】:

  • 你能发布更完整的代码吗?不清楚你是否在同一个 sem_t 上初始化并等待。你也有核心文件吗?堆栈跟踪?
  • @Nikolai 谢谢,我添加了更多代码,没有核心文件或堆栈跟踪。有没有办法在没有 gdb 的情况下获取堆栈跟踪?
  • 示例代码中的另一个歧义是ThreadWait() 中的变量q。这是一个全局变量吗?问题可能是内存覆盖吗?另外,您使用的是 fork() 还是 pthreads?
  • @atlpeg ThreadWait 中的 q 是一个全局变量。我正在使用 pthreads,使用互斥锁而不是信号量,一切正常(但速度很慢)。我已经检查过了,并且 q 没有在我的代码中的其他任何地方定义,所以我认为它不是覆盖。
  • @Evan,尝试gcore 从正在运行的进程中获取核心,pstack 获取堆栈跟踪。另外,你应该检查sem_init的返回值。

标签: c pthreads mutex parallel-processing semaphore


【解决方案1】:

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

【讨论】:

  • 你是个奇迹创造者。我只是注意到它没有返回值。使用 -Wall 编译的另一个原因。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
相关资源
最近更新 更多