Проблема с семафорами и sem_wait () - PullRequest
2 голосов
/ 29 марта 2010

У меня есть структура очереди, которая используется несколькими 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
  }
}

Я надеюсь, что это простая ошибка с моей стороны, которую я сейчас не вижу.

Заранее спасибо.

РЕДАКТИРОВАТЬ: добавить разъясняющий код

1 Ответ

3 голосов
/ 30 марта 2010

Если CreateQueue в приведенном выше примере завершено, то, похоже, не устанавливается глобальная переменная q. Он присваивает результаты локальной переменной. Но, похоже, она не возвращает переменную.

...