【发布时间】: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