QT多线程中的互斥与同步

来源:互联网 发布:代刷网 授权平台源码 编辑:程序博客网 时间:2024/06/05 11:32

qt为实现线程的同步与互斥,提供了几个类。

下面主要介绍三个类:

一、QMutex和QMutexLocker

[cpp] view plaincopy
  1. class key  
  2. {  
  3. public:  
  4.     key(){key = 0;}  
  5.     int createKey(){QMutexLocker locker(&mutex);++key;return key;}  
  6.     int value() const {QMutexLocker locker(&mutex);return key;}  
  7. private:  
  8.     int key;  
  9.     Qmutex mutex;  
  10. };  
 

二、QSemaphore

[cpp] view plaincopy
  1. #include <QtCore>  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. const int DataSize = 100000;  
  5. const int BufferSize = 8192;  
  6. int buffer[BufferSize];  
  7. QSemaphore freeBytes(BufferSize);  
  8. QSemaphore usedBytes(0);  
  9. class Producer : public QThread  
  10. {  
  11. public:  
  12.     void run();  
  13. };  
  14. void Producer::run()  
  15. {  
  16.     for (int i = 0; i < DataSize; ++i) {  
  17.         freeBytes.acquire();  
  18.         buffer[i % BufferSize] = (i % BufferSize);  
  19.         usedBytes.release();  
  20.     }  
  21. }  
  22. class Consumer : public QThread  
  23. {  
  24. public:  
  25.     void run();  
  26. };  
  27. void Consumer::run()  
  28. {  
  29.     for (int i = 0; i < DataSize; ++i) {  
  30.         usedBytes.acquire();  
  31.         fprintf(stderr, "%d ", buffer[i % BufferSize]);  
  32.         if(i % 16 ==0 && i!=0)  
  33.                 fprintf(stderr, "/n");  
  34.         freeBytes.release();  
  35.     }  
  36.     fprintf(stderr, "/n");  
  37. }  
  38. int main(int argc, char *argv[])  
  39. {  
  40.     QCoreApplication app(argc, argv);  
  41.     Producer producer;  
  42.     Consumer consumer;  
  43.     producer.start();  
  44.     consumer.start();  
  45.     producer.wait();  
  46.     consumer.wait();  
  47. //    return 0;  
  48.     return app.exec();  
  49. }  
 

三、QWaitCondition

[cpp] view plaincopy
  1. #include <QtCore>  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. const int DataSize = 10000;  
  5. const int BufferSize = 8192;  
  6. int buffer[BufferSize];  
  7. QWaitCondition bufferEmpty;  
  8. QWaitCondition bufferFull;  
  9. QMutex mutex;  
  10. int numUsedBytes = 0;  
  11. int rIndex=0;  
  12. class Producer : public QThread  
  13. {  
  14. public:  
  15.     void run();  
  16. };  
  17. void Producer::run()  
  18. {  
  19.    
  20.     for (int i = 0; i < DataSize; ++i) {  
  21.         mutex.lock();  
  22.         if (numUsedBytes == BufferSize)  
  23.             bufferEmpty.wait(&mutex);  
  24. //         mutex.unlock();  
  25.         buffer[i % BufferSize] = numUsedBytes;  
  26. //         mutex.lock();  
  27.         ++numUsedBytes;  
  28.         bufferFull.wakeAll();  
  29.         mutex.unlock();  
  30.     }  
  31. }  
  32. class Consumer : public QThread  
  33. {  
  34. public:  
  35.     void run();  
  36. };  
  37. void Consumer::run()  
  38. {  
  39.     forever {  
  40.         mutex.lock();  
  41.         if (numUsedBytes == 0)  
  42.             bufferFull.wait(&mutex);  
  43. //         mutex.unlock();  
  44.                 printf("%ul::[%d]=%d->%d /n", currentThreadId (),rIndex,buffer[rIndex],numUsedBytes);  
  45. //         mutex.lock();  
  46.                 rIndex = (++rIndex)%BufferSize;  
  47.         --numUsedBytes;  
  48.         bufferEmpty.wakeAll();  
  49.         mutex.unlock();  
  50.     }  
  51.     printf("/n");  
  52. }  
  53. int main(int argc, char *argv[])  
  54. {  
  55.     QCoreApplication app(argc, argv);  
  56.         for (int i = 0; i < BufferSize; ++i) {  
  57.             buffer[i    ] = -1;               
  58.         }  
  59.     Producer producer;  
  60.     Consumer consumerA;  
  61.         Consumer consumerB;  
  62.     producer.start();  
  63.     consumerA.start();  
  64.     consumerB.start();  
  65.     producer.wait();  
  66.     consumerA.wait();  
  67.         consumerB.wait();  
  68.     return 0;  
  69. }  
 

上面用QSemaphore和QWaitCondition两个类完成生产者和消费者实例,对

我们实际工作很有益处。

0 0
原创粉丝点击