当前位置: 首页 > news >正文

ps做网站 大小学校介绍网站模板

ps做网站 大小,学校介绍网站模板,山东专业的制作网站,个人网站开发主要问题对于生产者与消费者的数据处理的另一种好的解决方法是使用QWaitCondition类,允许线程在一定的条件下唤醒其他多个线程来共同处理。 一 定义公共变量 DataSize: 生产者生产数据的大小BufferSize: 也就是这个缓冲区的大小,每个单元是一个int#xff0c;也有可能是一个链表,结构…  对于生产者与消费者的数据处理的另一种好的解决方法是使用QWaitCondition类,允许线程在一定的条件下唤醒其他多个线程来共同处理。 一 定义公共变量 DataSize: 生产者生产数据的大小BufferSize: 也就是这个缓冲区的大小,每个单元是一个int也有可能是一个链表,结构体等等。mutex: 为了保证多个线程操作同一块数据时的原子性操作int numUsedBytes: 表示当前已经使用了多少个存储单元。int rIndex 0由于使用多个消费者线程处理生产者数据所以为了不重复读取设置全局变量rIndex用于标识当前读取到缓冲区的位置。 const int DataSize1000; const int BufferSize80; int buffer[BufferSize]; QWaitCondition bufferEmpty; QWaitCondition bufferFull; QMutex mutex; int numUsedBytes 0; int index 0; 二 生产者 同样的继承QThread在run函数中完成生产者的工作。首先进入for循环就必须对整个for循环中的操作进行加锁。只需要记住如果有一个变量在生产者和消费者线程中都会被改变那么这个变量存在的地方就必须加锁。比如这里的numUseBytes;if(numUsedBytes BufferSize) 如果已经使用的单元等于当前缓冲区单元数那么就必须等待消费者处理bufferEmpty.wait(mutex)等待“缓冲区有空位”也就是当缓冲区写满时等待消费者线程读取(处理)缓冲区wait()函数会将互斥量mutex在此解锁并且QWaitComdition在此等待。这个函数的原型如下 首先传入的参数是一个被锁定的互斥量如果传入时的互斥量不是被锁定的或者出现递归锁的情况那么wait会立刻返回。参数2传入的是等待时间首先我们要知道的是在这QWaitComdition在这里等待的结束条件。如果在其他线程调用了QWaitComdition的方法wakeOne或者wakeAll那么这个函数就会返回true由于第二个参数默认是永不超时但是当我们设置了超时并且在超时后并没有被唤醒那么就会返回false无论这个返回的是true还是false再返回前QWaitComdition都会将QMutex重新设置为锁定状态。 buffer[i%BufferSize] numUsedBytes生产者向缓冲区写入数据 numUsedBytes让使用过的缓冲单元数量加一 bufferFull.wakeAll()唤醒所有等待QWaitCondition的线程。对于wakeOne是随机唤醒一个等待线程而wakeAll则是唤醒所有等待线程。 bool QWaitCondition::wait(QMutex *mutex,unsigned long time ULONG_MAX); void Producer::run() {for(int i0;iDataSize;i){mutex.lock();if(numUsedBytes BufferSize){bufferEmpty.wait(mutex);}buffer[i%BufferSize] numUsedBytes;numUsedBytes;mutex.unlock();bufferFull.wakeAll();} } 三 消费者 首先我们判断当可用的数据为0时就需要等待生产者来激活QWaitCondition当缓冲单元有可用的数据时我们读取当前缓冲单元中的数据并对这个index下标进行处理。最后我们徐亚将numUsedBytes减一也就是缓冲区已经用过的数据-1。bufferEmpty.wakAll:激活所有等待缓冲区有空位的条件线程 void Consumer::run() {Q_FOREVER{mutex.lock();while (numUsedBytes 0) { // 确保缓冲区不为空bufferFull.wait(mutex, QDeadlineTimer::Forever);}qDebug()currentThreadId()indexbuffer[index];index (index)%BufferSize;--numUsedBytes;mutex.unlock();bufferEmpty.wakeAll();} } 四 调用 Producer producer;Consumer consumer;Consumer consumerB;producer.start();consumer.start();consumerB.start();producer.wait();consumer.wait();consumerB.wait(); 五 对qt书籍上示例的优化 5.1 wake的时机 在这里我把wake的时机放到了解锁之后,也就是先解锁后wake虽然二者的顺序无关紧要但是如果在这个场景下我们将wake放在解锁的后面对于消费者而言可能处理速度上就会快一点因为很多情况下可能并没有在wait等待需要wakeall是立即激活所有等待的线程此时会重新获得锁也就是lock(),但是也是会等待锁被释放后才能获取到。 5.2 消费者的线程同步问题 我们需要在判断是否有可读的数据时也加上while循环判断来进行wait否则就会导致一种场景当可用单元为0时此时两个消费者都在wait当生产者激活(将可以单元加1)后比如消费者A先获取到锁对其数据进行处理此时就会导致一个问题处理结束后可用单元numUsedByte变为了0紧接着进行unlock解锁但是此时消费者B就会紧接着获取到锁因为它在上次numUsedByte等于0是也在等待获取锁。此时就会将这个numUsedByte变为-1此时数据的处理就会乱套。
http://www.tj-hxxt.cn/news/217303.html

相关文章:

  • 聊城手机站网站公司电话深圳网站建设 公司元
  • 企业网站建设的好处过年做哪个网站致富
  • 网站做虚假广告wordpress原创meta
  • 做网站之前备案用html代码编写一个简单的网页
  • logo网站设计素材免费一键生成原创短视频app
  • 网站icp查询系统有没有教做韩餐的网站
  • 固定ip做网站怎么备案永久免费观看不收费的软件app
  • 泉州网站提升排名广东监理建设协会网站
  • 专门做物理的网站国产服务器品牌前十大排名
  • 网站基础建设英文注册一个有限公司需要多少钱
  • 网站浏览历史能恢复吗怎么设置的怎样在手机安装wordpress
  • 网站建设与用户需求分析深圳 营销型网站公司
  • 南昌企业制作网站设计网站建设价钱差异
  • 宜城网站开发网络营销外包
  • 网站建设合同模板wordpress 主题使用教程
  • 网站开发域名注册高性能 网站 建设
  • 网站建设与维护教案做电影网站侵权
  • 义乌市网站建设月付购物网站建站
  • 湛江网站模板如何制作个人网页兼职主页
  • 自己注册了个域名想做一个网站怎么做简单的视频网站
  • 加强廉政教育网站建设深圳广告标识设计公司
  • 湖南做电商网站需要什么条件建立一个网站 优帮云
  • 网站seo外链接哪个网站做团购要求低点
  • 网站建设工作人员有哪些职责游戏网站建设多少
  • 地方门户网站怎么赚钱郑州专业建站报价
  • 文化墙设计公司官网seo查询爱站网
  • 杭工e家app是哪个网站做的易优建站
  • 如何做好网站推广优化怎么架构网站
  • 盐城本地网站建设公司电话个人h5第三方支付接口
  • 小学校园网站建设要求wordpress禁止缩略图