【问题标题】:Concurrent programming c++? [closed]并发编程C++? [关闭]
【发布时间】:2010-09-18 03:23:36
【问题描述】:

我不断听到有关并发编程的消息。 你们能解释一下它是什么以及 c++ 新标准如何促进做同样的事情吗?

【问题讨论】:

标签: c++ concurrency c++11


【解决方案1】:

并发是指您的代码同时执行多项操作。这通常通过显式“线程”完成,但还有其他可能性。例如,如果您在代码中使用 OpenMP 指令,那么支持 OpenMP 的编译器会自动为您生成线程。

Thread 是“执行线程”的缩写。在单线程 C++ 程序中,执行从 main() 开始,然后按顺序进行。在多线程程序中,第一个线程从 main 开始,但其他线程可能由应用程序启动,这些线程从用户指定的函数开始。然后这些线程同时运行,或与原始线程并行运行。

在 C++0x 中,线程是使用 std::thread 类启动的:

void my_function()
{
    // do stuff
}
std::thread my_thread(my_function); // run my_function in its own thread

新的 C++0x 标准还支持:

  • std::atomic<> 类模板的原子值和操作,
  • 用于数据保护的互斥锁(std::mutexstd::recursive_mutex 等)
  • 用于轻松管理锁生命周期的锁类(std::lock_guard<>std::unique_lock<>
  • std::lockstd::try_lock 函数用于管理同时获取多个锁而不会有死锁风险
  • 便于等待事件的条件变量(std::condition_variablestd::condition_variable_any
  • futures、promise 和打包任务来简化线程之间的数据传递,并等待值准备好。这解决了经典的“如何从线程返回值”问题。
  • 本地静态对象的线程安全初始化
  • thread_local 关键字声明线程本地数据

我在 devx.com 上的文章中对新的 C++0x 线程库进行了更详细的概述:Simpler Multithreading in C++0x

我在my blog 上写了关于 C++ 中的多线程和并发的文章。我也在写一本关于这个主题的书:C++ Concurrency in Action

【讨论】:

  • 既然 C++11 出来了,还能添加什么吗?我可以想象我们现在可以使用移动语义了?
  • 是的,您可以将移动语义与 std::threadstd::async 一起使用。
【解决方案2】:

当您说“c++ 新标准如何促进”并发编程时,我假设您指的是即将发布的(?)C++09 标准。

目前处于草案形式的新标准支持以下有助于并发编程的项目:

  • 原子类型和地址
  • 一个线程类
  • thread_local 存储(几个月前刚刚添加到标准草案中)
  • 互斥(互斥类)
  • 条件变量 - 这对 Windows 特别好,因为条件变量很难在 Win32 中正确实现。这意味着最终微软应该至少在 MSVC++ 运行时提供对条件变量的支持,这样在 WIn32 上就很容易获得正确的条件变量语义。

【讨论】:

  • 有人写过关于这些特性的总结吗?
  • 我认为它们在很大程度上基于 boost::thread,因此该文档与新标准之间应该没有太大区别。
【解决方案3】:

【讨论】:

    【解决方案4】:

    并发是指给定进程有多个执行线程。截至今天,C++ 不直接支持它。但是,存在几个库,它们会将给定函数绑定到新的执行线程。 Unix 标准是 pthreads 库。

    【讨论】:

    • Posix 标准(不是 Unix)
    • 谁能解释我怎么可能有 2 个有争议的答案:是的,C++ 是一种并发语言(上图),不,并发是另一回事(这个)?谁错了?
    【解决方案5】:

    C++CSP2 - C++ 的简单并发

    http://www.cs.kent.ac.uk/projects/ofa/c++csp/

    CSP 是基于适当的并发范例,而不是线程和锁以及所有其他事后才添加的东西。

    (有关并发编程语言(也基于 CSP),请参阅 Occam-Pi)

    【讨论】:

      【解决方案6】:

      我的看法略有不同,具体到编程范式的未来方向:

      并发是关于编写程序,以便在硬件支持的情况下它可以同时执行多项操作。目前,大多数语言都有相当繁重和复杂的机制来允许程序员指定这一点(例如:具有手动同步的线程、OpenMP 预处理器指令等)。

      随着硬件的改进,它将横向(更多内核)而不是纵向(更快的单核)改进。这意味着应用程序需要具有“潜在并发性”才能使用“更快”的硬件进行扩展。语言目前正在努力发展以最好地支持这一点,以成为未来发展的最佳语言。

      C++0x 正在为“旧”的并发编程方法添加更多内置支持。各种编译器供应商正在添加“新”方法,这些方法抽象线程模型并允许在运行时决定线程数量等(基于机器的硬件);特别是对于 Microsoft,请参阅 F#、并发运行时、并行扩展等。

      希望对您有所帮助。

      【讨论】:

        【解决方案7】:

        这是了解并发编程最好的文章:Concurrent Programming

        读完后你将全面了解并发编程和C++。

        作为一个快速的总结,我们可以说并发编程就是做多任务处理。当一个程序被阻塞时,它可以做其他事情。通常我们在等待网络连接和处理 I/O 时会被阻塞。我们可以使用fork() 和线程库来促进并发编程。

        【讨论】:

        • 您发布的链接返回 404。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-14
        • 2016-03-16
        • 2023-03-04
        • 2011-06-30
        • 2011-02-25
        • 2021-08-28
        • 1970-01-01
        相关资源
        最近更新 更多