用于线程的标准库版本的“等待警报/事件”

时间:2014-10-22 04:23:08

标签: c++ multithreading events c++11 c++14

C ++有没有通过Wait + Wake进行某种线程同步的概念?等待事件,警报,对象等?像WaitForSingleObject,WaitOnAddress等等?我能找到的唯一东西是std::thread::join,以及像锁和std::atomic这样的围栏/同步内容。 C ++的线程还有更多吗?未来会有更多的消息吗?

2 个答案:

答案 0 :(得分:4)

如果你只是需要线程之间的信令C ++ 11有Condition Variables。条件变量将锁定需要访问此变量的线程,直到它们被最初锁定资源的线程“发出信号”。您可以构建更高级别的构造,如WaitFor,假设您可以使用线程级锁定。

如果您想要C#Tasks之类的东西,那么就不会像标准库中的C ++ 11那样。在C ++ 11中,只有线程原语被添加到语言中,它们的语义处于“线程级”。试图在没有添加某些语言功能的情况下实现它们充其量是混乱的。

我的下一个建议是,如果条件变量不满足,则使用回调来反转程序控制。像OpenMAX和OpenSL ES这样的实时处理库不使用“事件”,它们在同一个线程上使用回调。这些回调是您挂钩代码以将更多数据发送到设备或将数据快速存储到其他位置以便稍后处理的位置。

最后,看看您是否可以更改问题以使其适合现有库。像https://www.threadingbuildingblocks.org/这样的库几乎是C ++线程的黄金标准。如果存在针对常见问题的良好解决方案,那么他们很有可能拥有一个。

答案 1 :(得分:1)

  

还有更多C ++的线程吗?

是。这些都不是深刻的黑暗秘密 - 所有这些都是非常公开且易于获取的信息。

请参阅cppreference.com -Thread support library

对于一些深入,更多的学术讨论,从这里开始:C ++编程语言 - 第四版 - Bjarne Stroustrup:

  

<强> 42。主题和任务

     

42.1。引言

     

在教程中引入了C ++标准的并发支持   §5.3中的方式。本章和前一章提供了更多内容   详细而系统的观点。我们称之为可能执行的活动   与其他活动同时执行任务。一个线程是   用于执行计算机的计算机设备的系统级表示   任务....

     

42.2。的线程

     

线程是计算机硬件概念的抽象概念   计算。 C ++标准库线程旨在映射   与操作系统的线程一对一。我们在使用线程时   程序中的几个任务需要同时进行。在一个系统上   有几个处理单元(“核心”),线程允许我们使用   那些单位......

     

42.3。 避免数据竞争

     

......这些简单的规则基于避免尝试的想法   同时访问数据,因此它们不需要锁定和导致   最高效的程序。例如,他们无法使用的地方,   因为需要共享大量数据,所以使用某种形式的锁定:   互斥锁:互斥锁(互斥变量)是一个常用的对象   代表访问某些资源的专有权。访问   资源,获取互斥锁,访问,然后释放互斥锁   (§5.3.4,§42.3.1)。 •条件变量:条件变量是a   线程用来等待另一个事件生成的事件的变量   线程或计时器(§5.3.4.1,§42.3.4)......

     

42.3.1。的互斥

     

互斥锁是一个用于表示对某些人的独占访问的对象   资源。因此,它可以用于防止数据竞争和   同步访问多个线程之间共享的数据。该   “普通”互斥体是最简单,最小,最快的互斥体。

     

42.4。 基于任务的并发

     

到目前为止,本章重点介绍了并发运行的机制   任务:重点是线程,避免竞争条件,以及   同步线程。对于许多并发任务,我发现重点关注   分散指定的真实任务(原文如此!)的机制   并发任务。本节重点介绍一种简单的   任务:在给定参数的情况下执行一项任务并生成一项的任务   结果

     

42.4.1。 未来和承诺

     

如第5.3.5节所述,任务之间的通信由a处理   未来/承诺对任务将其结果放入承诺中,并且需要结果的任务从中检索结果   相应的未来:

     

42.4.6。的异步()

     

async()函数基本上是启动器的简单接口   未知的复杂性。调用async()会返回R的未来   是任务结果的类型。例如......

继续.....

@ MorphingDragon关于条件变量的答案当然很重要,但它还远不止于此。虽然英特尔的TBB当然非常出色,但是STL for C ++ 11现在包含了上面列出的用于支持并发的功能,许多以前只能通过补充库提供。