使用 sleep() 时,生产者使用者(使用监视器)代码不起作用

producer consumer (using Monitor) code is not working when sleep() is used?

本文关键字:监视器 代码 不起作用 生产者 sleep 使用 使用者      更新时间:2023-10-16
#include<bits/stdc++.h>
#include<pthread.h>
#include<unistd.h>
#define MAX 10
using namespace std;
class BoundedBuffer
{
private:
  int buffer[MAX];
  int fill, use;
  int fullEntries;
  pthread_mutex_t monitor;  // monitor lock
  pthread_cond_t empty;
  pthread_cond_t full;
public:
  BoundedBuffer ()
  {
    use = fill = fullEntries = 0;
  }
  void produce (int element)
  {
    pthread_mutex_lock (&monitor);
    while (fullEntries == MAX)
      pthread_cond_wait (&empty, &monitor);
    buffer[fill] = element;
    fill = (fill + 1) % MAX;
    fullEntries++;
    //sleep(rand()%2);
    pthread_cond_signal (&full);
    pthread_mutex_unlock (&monitor);
  }
  int consume ()
  {
    pthread_mutex_lock (&monitor);
    while (fullEntries == 0)
      pthread_cond_wait (&full, &monitor);
    int tmp = buffer[use];
    use = (use + 1) % MAX;
    fullEntries--;
    //sleep(rand()%2);
    pthread_cond_signal (&empty);
    pthread_mutex_unlock (&monitor);
    return tmp;
  }
}b;
void* producer(void *arg){
int i=1;
while(true){
b.produce(i);
i++;
}
}
void* consumer(void *arg){
while(true){
cout<<b.consume()<<" ";
}
}
int main(){
pthread_t t1,t2;
pthread_create(&t1,NULL,producer,NULL);
pthread_create(&t2,NULL,consumer,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
return 0;
}

每当在 BoundedBuffer.consume() 和 BoundedBuffer.produce(int) 中添加 sleep() 时,它都不会打印任何输出。但是当这些函数中没有 sleep() 时,它可以正常工作并按应有的方式打印输出。为什么会这样?
参考:http://pages.cs.wisc.edu/~remzi/OSTEP/threads-monitors.pdf

当我使用 fflush(stdout) 时,我看到正在打印输出

while(true){
cout<<"["<<b.consume()<<"] ";
fflush(stdout)
}

输出:

Magnum@SimpleGuy:~ [52]$ ./a.out [1

] [2] [3] [4] [5] [6] [7] [8]

你尝试运行该程序多久了?
您是否阅读了兰德和睡眠的文档。
兰特函数链接

睡眠功能链接

兰德每次都可能返回一个大数字,而您的生产者在第一次生产东西后会睡很长时间,在此期间,您的消费者只是等待cond_wait。

尝试使用较小的睡眠间隔"usleep"或类似的东西,您会发现您的程序运行良好。

毫/微秒休眠功能链路