2

複数のpthreadで使用されているキュー構造があります。スレッドが空でない場合、スレッドはキューからデキューしてからビジネスを実行することになっています。

私は当初、これを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
  }
}

これが私の側の単純な間違いであり、今は見えないことを願っています。

前もって感謝します。

編集:いくつかの明確なコードを追加する

4

1 に答える 1

3

上記の例が完了している場合は、グローバル変数CreateQueueを設定していないようです。q結果をローカル変数に割り当てます。しかし、それは変数を返さないようです。

于 2010-03-29T20:16:31.453 に答える