C thread-mutex编码错误?

时间:2010-12-07 13:56:43

标签: c pthreads mutex

以下是代码:

....
typedef struct {
  int buf[10];
  long head, tail;
  int full, empty;
  pthread_mutex_t *mut;
  pthread_cond_t *notFull, *notEmpty;
} queue;

int main(){
  queue *que;
  pthread_t sup, cut;
  que = queueInit();
  if(que == NULL){
    fprintf(stderr, "Queue Init failed");
    exit(1);
  }
  pthread_create(&sup, NULL, insertQueue, (void*) que);
  pthread_create(&cut, NULL, insertQueue, (void*) que);
  pthread_join(sup,NULL);
  pthread_join(cut,NULL);
  queueDelete(que);
  return 0;
}

void *insertQueue(void *q)
{
  queue *que;
  int i;
  que = (queue *)q;
  for(i=0; i<20;i++){
    // Get mutex lock on the queue
    pthread_mutex_lock(&mut); // Question (i) I guess this line is wrong
    while(que>full){
      printf("Its full");
      // pthread wait condition for queue not full
      pthread_cond_wait(&notFull, &mut); // Question (ii)
    }
    queueAdd(que,i);
    // Unlock the queue
    pthread_mutex_unlock(&mut); // Question (iii)
    // Send signal saying there is data to be read
    pthread_cond_signal(&notEmpty); // Question (iv)
    usleeep(100000);)
    return(NULL);
  }
}

queue *queueInit(void){
  queue *q;
  q = (queue *)malloc(sizeof(queue));
  if(q==NULL) return (NULL);
  q->empty = 1;
  q->full = 0;
  q->head = 0;
  q->tail = 0;
  q->mut=(pthread_mutex_t *)malloc(sizeof(pthread_mutex_t));
  // Set default condition
  pthread_mutex_init(&mut,NULL); // Question v
  // Condition for not null
  pthread_mutex_init(&notNull,NULL); // Question vi
  // Condition for not empty
  pthread_mutex_init(&notEmpty,NULL); // Question vi
  return (q);
}
....

我在代码中提出了我的问题,即问题i - vi

我的感觉告诉我,我的论点是错误的,例如问题vi:

pthread_cond_init(notEmpty,NULL);

它应该是别的东西,而不是“(&amp; notEmpty,Null)”。

请帮忙。

2 个答案:

答案 0 :(得分:2)

notNull在两个地方写成notFullnotNullnotEmpty是条件变量而不是互斥量,应该初始化。 没有为notNullnotEmpty分配内存。

queue声明为:

可能更好
typedef struct {
  int buf[10];
  long head, tail;
  int full, empty;
  pthread_mutex_t mut;
  pthread_cond_t notFull;
  pthread_cond_t notEmpty;
} queue;

然后保留所有&个字符。这意味着你可以通过一次调用来动画整个游戏。

最后,我认为您的意思是while(que->full)而不是while(que>full)

答案 1 :(得分:1)

当你已经有一个指针时,你不应该使用&。改变这个:

// Set default condition
  pthread_mutex_init(&mut,NULL); // Question v
  // Condition for not null
  pthread_mutex_init(&notNull,NULL); // Question vi
  // Condition for not empty
  pthread_mutex_init(&notEmpty,NULL); // Question vi

到此:

// Set default condition
  pthread_mutex_init(mut,NULL); // Question v
  // Condition for not null
  pthread_mutex_init(notNull,NULL); // Question vi
  // Condition for not empty
  pthread_mutex_init(notEmpty,NULL); // Question vi

注意{I}我收拾的&mut已经是一个指针,使&mut试图获得指向pthread_mutex_t的指针