加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 另一种检查std :: queue事件的方法?

发布时间:2020-12-16 09:42:21 所属栏目:百科 来源:网络整理
导读:好吧,我正在尝试处理某种队列.我有一个IO线程,它专门用于从std :: queue中弹出数据,但问题是我正在使用Sleep()以防止100%cpu常量检查.当然还有其他线程会将项添加到std :: queue. 我怎样才能创建一个事件,以便线程处于休眠状态,并且仅在std :: queue不为空
好吧,我正在尝试处理某种队列.我有一个IO线程,它专门用于从std :: queue中弹出数据,但问题是我正在使用Sleep()以防止100%cpu常量检查.当然还有其他线程会将项添加到std :: queue.

我怎样才能创建一个事件,以便线程处于休眠状态,并且仅在std :: queue不为空时才启动?

IO线程

Sleep(100);
while (!myqueue.empty())
  {
     //process data FIFO
     myqueue.pop(); //pop out and continue
  }

非常感谢,谢谢!哦,这是针对c 11或c 03,无关紧要 – 在Windows上.

解决方法

std :: queue绝对与线程无关.完全没有.它的.empty()成员不是线程安全的(只是可重入的)!这同样适用于其他所有成员.因此,多个线程可以使用不同的队列,但是每次只有一个线程可以对每个实例执行任何操作.

C 11或C 03很重要.因为C 11定义了线程同步原语,而C 03没有,你必须使用OS API.

在C 11中你会对std::condition_variable感兴趣.

在C 03中,您会对Boost.Thread(主要与C 11兼容)Events或Semaphores感兴趣.

在任何一种情况下,std :: queue :: push()和std :: queue :: pop()本身都必须受到互斥的保护. std :: condition_variable甚至强制你使用一个(std::mutex),在Windows API中你使用Critical Section.

在Windows上,C 11类仅在Visual Studio 2012和Windows 8中可用.较旧的编译器使用Boost(优点是它可以是可移植的)或本机API.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读