Qt -多线程间的互斥

  

一。多线程间的互斥

  

<强>临界资源——每次只允许一个线程进行访问的资源
线程间的互斥——多个线程在同一个时刻需要访问临界资源
QMute类是一把线程锁,保证线程强间的互斥,利用线程锁能够保证临界资源的安全性
QMutex中的关键成员函数
空白锁()——当锁空闲时,获取锁并继续执行;当锁被获取时,阻塞并等待释放
空白解锁()——释放锁(同一把锁的获取和释放必须在同一线程中成对出现)
a生产消费者问题
1。有n个生成者同时制造产品,并把产品放入仓库中
2。有m个消费者同时需要从仓库中取出产品
所定的规则是——当仓库未满,任意生产者可以存入产品,当仓库未空,任意消费者可以取出产品
代码示例

  
 <代码> # include & lt; QCoreApplication>
  # include & lt; QThread>
  # include & lt; QMutex>
  # include & lt; QDebug>
  
  静态QMutex g_mutex;//线程锁
  静态QString g_store;
  
  类生产商:公共QThread
  {
  保护:
  空白run ()
  {
  int数=0;
  
  而(真)
  {
  g_mutex.lock ();
  
  g_store.append (QString:数字(10)(计数+ +)%);
  
  qDebug () & lt; & lt;objectName () & lt; & lt;“:”+ g_store;
  
  g_mutex.unlock ();
  
  msleep (1);
  }
  }
  };
  
  类顾客:公共QThread
  {
  保护:
  空白run ()
  {
  而(真)
  {
  g_mutex.lock ();
  
  如果(g_store !=" ")
  {
  g_store。删除(0,1);
  
  qDebug () & lt; & lt;objectName () & lt; & lt;“:”+ g_store;
  }
  
  g_mutex.unlock ();
  
  msleep (1);
  }
  }
  };
  
  int主要(int命令行参数个数,char * argv [])
  {
  QCoreApplication(命令行参数个数,argv);
  
  制片人p;
  客户c;
  
  p.setObjectName(“制片人”);
  c.setObjectName(“客户”);
  
  p.start ();
  c.start ();
  
  返回a.exec ();
  }
   
  

运行的结果
 Qt——多线程间的互斥“> <br/> <强> b线程的死锁概念——线程间相互等待临界资源而造成彼此无法继续执行</强> <br/>发生死锁的条件<br/> 1。系统中存在多个临界资源且临界资源不可抢占<br/> 2。线程需要多个临界资源才能继续执行<br/> <img src=Qt -多线程间的互斥