Qt生产者消费者实验(1):信号量


[cpp] view plain copy print ?
  1. /* 
  2. 生产者和消费者实验使用信号量实现线程的同步 
  3. */  
  4. #include <QtCore>  
  5. #include <iostream>  
  6.   
  7. const int DataSize = 100;  
  8. const int BufferSize = 10;  
  9. char buffer[BufferSize];  
  10.   
  11. //定义两个信号量  
  12. QSemaphore freeSpace(BufferSize);  
  13. QSemaphore usedSpace(0);//刚开始没有生产者写好的数据,所以初始化为0  
  14.   
  15.   
  16. //生产者  
  17. class Producer : public QThread  
  18. {  
  19. public:  
  20.     void run();  
  21. };  
  22.   
  23. //start()调用的就是run()函数。他是一个虚函数,默认情况下调用exec()  
  24. //从该函数返回表示线程已经结束  
  25. //生产者随机生成一个字母填充进缓冲区buffer  
  26. void Producer::run()  
  27. {  
  28.     for (int i = 0; i < DataSize; ++i) {  
  29.         freeSpace.acquire();//获取“自由的”字节  
  30.         buffer[i % BufferSize] = "ACGT"[uint(rand()) % 4];  
  31.         std::cerr << "P";  
  32.         usedSpace.release();//转换为“用过的”(填充过的)字节  
  33.     }  
  34. }  
  35.   
  36.   
  37. //消费者  
  38. class Consumer : public QThread  
  39. {  
  40. public:  
  41.     void run();  
  42. };  
  43. //将生产者填充进“用过的”字节的字幕读取并输出到控制台  
  44. void Consumer::run()  
  45. {  
  46.     for (int i = 0; i < DataSize; ++i) {  
  47.         usedSpace.acquire();//获取“用过的”资源,如果没有则一直阻塞,直到有资源为止  
  48.         //std::cerr << buffer[i % BufferSize];  
  49.         char Cons = buffer[i % BufferSize];  
  50.         std::cerr <<"c";  
  51.         freeSpace.release();  
  52.     }  
  53.     std::cerr << std::endl;  
  54. }  
  55.   
  56.   
  57. //主程序  
  58. int main()  
  59. {  
  60.     Producer producer;  
  61.     Consumer consumer;  
  62.     producer.start();//通过调用run来执行线程  
  63.     consumer.start();  
  64.     producer.wait();//wait()和pthread_join()功能类似  
  65.     consumer.wait();  
  66.     return 0;  
  67. }  

执行结果:

BufferSize 不同对应的结果也稍有不同

(1)

const int DataSize = 100;
const int BufferSize = 1;

PcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPc

(2)


const int DataSize = 100;
const int BufferSize = 10;

PPPPPPPPPPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcccccccccc

(3)

const int DataSize = 100;
const int BufferSize = 100;

PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP

你可能感兴趣的:(Qt生产者消费者实验(1):信号量)