QT 多线程 互斥

qt应用的多线程实例简单实现,语法超级简单,用两种方法实现同步和互斥。一种是Semaphore信号量,另一种是mutex锁和condition条件变量。下面开始。

第一种,QSemaphore信号量方式:

通过Qt Creator创建一个控制台项目,项目创建完以后只有一个main.cpp文件和一个.pro配置文件,在main.cpp添加如下内容

 
  1. #include <QSemaphore>

  2. #include <QThread>

  3. #include <QApplication>

  4. const qint32 DataSize=10;

  5. const qint32 BufferSize=4;

  6. //仓库

  7. int buffer[BufferSize];

  8. //控制生产者线程信号量:写入的数据缓冲区

  9. QSemaphore freeSpace(BufferSize);

  10. //控制消费者线程信号量:读取的数据缓冲区

  11. QSemaphore usedSpace(0);

  12. //生产者线程类

  13. class threadProducer:public QThread

  14. {

  15. public:

  16. void run()

  17. {

  18. for(int i=0;i<DataSize;++i)

  19. {

  20. //仓库有空闲位置,生产一个数据

  21. //空闲位置少一个,控制生产的信号量加一

  22. freeSpace.acquire();

  23. buffer[i%4]=i+1;

  24. qDebug("producer::%d",buffer[i%4]);

  25. //可消费的数据多一个,控制消费者信号量+1

  26. usedSpace.release();

  27. sleep(1);

  28. }

  29. }

  30. };

  31. class threadConsumer:public QThread

  32. {

  33. public:

  34. void run()

  35. {

  36. for(int i=0;i<DataSize;++i)

  37. {

  38. usedSpace.acquire();

  39. qDebug("consumer:%d",buffer[i%4]);

  40. freeSpace.release();

  41. sleep(2);

  42. }

  43. }

  44. };

  45. int main(int argc, char *argv[])

  46. {

  47. QCoreApplication a(argc, argv);

  48. threadConsumer consumer;

  49. threadProducer producer;

  50. producer.start();

  51. consumer.start();

  52. producer.wait();

  53. consumer.wait();

  54. return a.exec();

  55. }

第二种,QWaitCondition和QMutex方式

 
  1. #include <QCoreApplication>

  2. #include <QThread>

  3. #include <QWaitCondition>

  4. #include <QMutex>

  5. const qint32 DataSize=10;

  6. const qint32 BufferSize=4;

  7. int buffer[BufferSize];

  8. QWaitCondition bufferIsNotFull;

  9. QWaitCondition bufferIsNotEmpty;

  10. QMutex mutex;

  11. int usedSpace=0;

  12. //生产者线程类

  13. class threadProducer:public QThread

  14. {

  15. public:

  16. void run()

  17. {

  18. for (int i=0; i<DataSize; ++i)

  19. {

  20. mutex.lock();

  21. //如果仓库满了,不生产,等待销费

  22. while (usedSpace==BufferSize)

  23. {

  24. bufferIsNotFull.wait(&mutex);

  25. }

  26. buffer[i%4]=i+1;

  27. qDebug("producer:%d",buffer[i%4]);

  28. ++usedSpace;

  29. bufferIsNotEmpty.wakeAll();

  30. mutex.unlock();

  31. }

  32. }

  33. };

  34. class threadConsumer:public QThread

  35. {

  36. public:

  37. void run()

  38. {

  39. for(int i=0;i<DataSize;++i)

  40. {

  41. mutex.lock();

  42. while (usedSpace==0)

  43. {

  44. bufferIsNotEmpty.wait(&mutex);

  45. }

  46. qDebug("consumer:%d",buffer[i%4]);

  47. --usedSpace;

  48. bufferIsNotFull.wakeAll();

  49. mutex.unlock();

  50. }

  51. }

  52. };

  53. int main(int argc, char *argv[])

  54. {

  55. QCoreApplication a(argc, argv);

  56. threadConsumer consumer;

  57. threadProducer producer;

  58. producer.start();

  59. consumer.start();

  60. producer.wait();

  61. consumer.wait();

  62. return a.exec();

  63. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值