【问题标题】:Standard Library version of "Wait for Alert/Event" for threading用于线程的“等待警报/事件”的标准库版本
【发布时间】:2014-10-22 04:23:08
【问题描述】:

C++ 是否有任何通过 Wait+Wake 进行线程同步的概念?等待事件、警报、对象等?像WaitForSingleObject、WaitOnAddress 等?我能找到的唯一东西是std::thread::join,以及诸如锁和std::atomic 之类的栅栏/同步的东西。 C++ 的线程还有更多内容吗?未来还会有更多吗?

【问题讨论】:

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,我知道 C++11 线程的至少一个主要特性是我没有找到的,那就是 std::condition_variable。现在,我只需要对其进行基准测试,看看我是否可以将自己从特定于操作系统的同步概念中分离出来;)
【解决方案2】:

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)。 • 条件变量:条件变量是 一个线程用来等待另一个线程生成的事件的变量 线程或计时器(§5.3.4.1、§42.3.4)...

42.3.1。 互斥体

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

42.4。 基于任务的并发

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

42.4.1。 未来与承诺

如第 5.3.5 节所述,任务之间的通信由一个 未来/承诺对任务将其结果放入 Promise 中,需要结果的任务从 对应的未来:

42.4.6。 async()

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

然后继续.....

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

【讨论】:

  • 谢谢,但我对所有这些概念都非常熟悉。 10 年来,我一直在做 Windows 线程(以及偶尔的其他操作系统)。我问标准库必须提供什么。在 C++11 之前,标准库在这方面几乎没有任何东西,所以我试图赶上标准库中提供的最新跨平台的东西。我接受了另一个答案,不是因为它提到了条件变量的概念,而是因为它提到 std::condition_variable 是一个活生生的工作。
  • 查看关于基于任务的并发的编辑和future/promise - 一种处理线程间通信的重要新方法。这一切都在 C++11 中。
  • @Vector 如果我们了解 C++11 并发的所有细节,我们会在这里待一会儿。 :)
  • @MorphingDragon - 没有争论。这就是为什么我说“然后继续……”
猜你喜欢
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 2021-11-11
  • 2020-10-04
  • 1970-01-01
  • 2011-07-21
相关资源
最近更新 更多