【问题标题】:My Posix Thread wakes up without a signal我的 Posix 线程在没有信号的情况下唤醒
【发布时间】:2011-10-15 01:43:38
【问题描述】:

我正在尝试使用 POSIX 线程实现阻塞队列。重要的代码段如下所示。我试图运行这个程序。当队列中没有元素时,尝试从队列中删除元素的线程进入睡眠状态,并在没有来自将元素添加到队列中的线程的任何信号的情况下再次唤醒(我得出结论,因为我没有启动任何线程将一个元素添加到队列中)。再次唤醒的线程进入睡眠状态,并重复此过程。我究竟做错了什么?请有人告诉我我在这里缺少什么?

struct rqueue
{
  int qsize;
  int capacity;
  pthread_mutex_t lock;
  pthread_cond_t not_empty;
  pthread_cond_t not_full;
 };

删除元素方法:

pthread_mutex_lock(&rq->lock);

  while(rq->qsize == 0){
      perror("Q size is zero going to sleep");
      pthread_cond_wait(&rq->not_empty);
      perror("woke up");
  }

// some code
  pthread_cond_signal(&rq->not_full);
  pthread_mutex_unlock(&rq->lock);

添加元素方法:

pthread_mutex_lock(&rq->lock);

  if(rq->capacity != -1 ){

      while(rq->qsize == rq->capacity){
        pthread_cond_wait(&rq->not_full);
      }
  }

  //some code

  pthread_cond_signal(&rq->not_empty);
  pthread_mutex_unlock(&rq->lock);

【问题讨论】:

    标签: c pthreads producer-consumer


    【解决方案1】:

    pthread_cond_wait() 有两个参数——第二个是你持有的互斥锁。你只传递了一个参数。

    另外,您是否使用 pthread_mutex_init() 和 pthread_cond_init() 初始化了互斥锁和条件变量?

    【讨论】:

    • 另外,这种情况多久发生一次?如果它很少见,那是正常的——可能是spurious wakeup
    • 非常感谢。我忘记了第二个论点。它现在似乎正在工作。但是编译器应该说没有匹配的函数吧?
    • 如果编译器接受了您的代码但缺少参数,这几乎肯定意味着您 (1) 忘记包含 pthread.h,并且 (2) 已禁用所有警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    相关资源
    最近更新 更多