У меня есть структура очереди, которая используется несколькими pthreads. Предполагается, что потоки удаляются из очереди, если она не пустая, а затем занимаются своими делами.
Первоначально я настроил это как цикл while, где потоки проверяли, была ли очередь пустой, используя mutex_lock. К сожалению, это замедлило выполнение моей программы.
Я пытался реализовать семафор как переменную count в моей очереди, но, к сожалению, я сталкиваюсь с segfault, когда пытаюсь вызвать 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
}
}
Я надеюсь, что это простая ошибка с моей стороны, которую я сейчас не вижу.
Заранее спасибо.
РЕДАКТИРОВАТЬ: добавить разъясняющий код