用于线程"Wait for Alert/Event"的标准库版本



C++是否有通过某种类型的Wait+Wake进行线程同步的概念?正在等待事件、警报、对象等?像WaitForSingleObject、WaitOnAddress等?我能找到的只有std::thread::join,以及fence/sync之类的东西,比如锁和std::atomic。C++的线程还有更多的东西吗?将来还会有更多的吗?

如果您只需要在线程之间发出信号,C++11有条件变量。条件变量将锁定需要访问该变量的线程,直到最初锁定资源的线程发出"信号"。您可以构建更高级别的构造,如WaitFor,假设您对线程级别的锁定没有问题。

如果你想要像C#任务这样的东西,而不是标准库中的C++11。在C++11中,只有线程原语被添加到该语言中,它们的语义处于"线程级别"。试图在不添加某些语言功能的情况下实现它们充其量是一团糟。

如果条件变量不满足,我的下一个建议是使用回调反转程序控制。像OpenMAX和OpenSL ES这样的实时处理库不使用"事件",而是在同一个线程上使用回调。这些回调是挂接代码的地方,可以将更多数据发送到设备,或者将数据快速存储在其他地方以供稍后处理。

最后,看看你是否可以改变你的问题,使其适合现有的库。像这样的图书馆https://www.threadingbuildingblocks.org/几乎是C++线程的黄金标准。如果一个常见问题有一个好的解决方案,他们很有可能会有一个。

C++的线程还有更多功能吗

是。这些都不是深层次的黑暗秘密——都是相当公开和容易获取的信息

请参阅cppreference.com-线程支持库

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

42.线程和任务

42.1.简介

C++标准对并发性的支持在教程中介绍第5.3条中的方式。本章和上一章提供了更多详细而系统的观点。我们调用可能执行的活动与其他活动同时执行任务。线程是计算机执行任务

42.2.线程

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

42.3.避免数据竞争

这些简单的规则基于避免尝试同时访问数据,因此它们不需要锁定并导致最高效率的程序。在例如不能使用它们的情况下,由于需要共享大量数据,请使用某种形式的锁定:•互斥:互斥(互斥变量)是一个用于表示访问某些资源的专有权。访问资源,获取互斥,访问,然后释放互斥(§5.3.4,§42.3.1)。•条件变量:条件变量是线程用于等待另一个线程生成的事件的变量线程或计时器(§5.3.4.1,§42.3.4)…

42.3.1.多聚体

互斥对象是一种用于表示对某些资源因此,它可以用于防止数据竞争同步对多个线程之间共享的数据的访问。这个"普通"互斥是最简单、最小、最快的互斥。

42.4.基于任务的并发

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

42.4.1.未来和承诺

如§5.3.5所述,任务之间的通信由未来/承诺对任务将其结果放入promise中,需要结果的任务从相应的未来:

42.4.6.异步()

async()函数基本上是一个到的启动器的简单接口未知的复杂度。async()的调用返回一个future,其中R是其任务结果的类型。例如

然后继续

@MorphingDragon关于条件变量的答案当然很重要,但它的意义远不止于此。尽管Intel的TBB当然非常出色,但C++11的STL现在包括了上面列出的支持并发的功能,其中许多以前只能通过补充库获得。

最新更新