c - 我的 Posix 线程在没有信号的情况下唤醒

标签 c pthreads producer-consumer

我正在尝试使用 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);

最佳答案

pthread_cond_wait() 有两个参数——第二个是您持有的互斥体。您只向它传递一个参数。

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

关于c - 我的 Posix 线程在没有信号的情况下唤醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7775215/

相关文章:

c - 为什么我的 while(read) 管道循环永远不会结束?

c - MDI子窗口和状态栏C win32 API

c - 在 C 中实现定时事件

c# - BlockingCollection 与异步任务

两端都有等待的消费者/生产者

c - 一个消费者和两个生产者中的任何一个

c# - 如何从C#调用DLL中的C函数?

c - 使用 Pango 将文本呈现为使用 FreeType 字体的图像的简单示例是什么?

C - 使用互斥锁同步多个线程

c++ - Pthread_setaffinity_np 参数无效