并发编程 C++?

47

我到处听到并发编程的话题。 你们能否简要介绍一下什么是并发编程以及C++新标准如何方便进行并发编程?


文章:查看以下文章了解并发性知识 1. 免费午餐结束了 2. 由herbsutter选出的文章 3. pdf链接 - yesraaj
3
如果“Concurrent computing”对你来说很新,确保查看一些基础文章,比如http://en.wikipedia.org/wiki/Concurrent_programming。 - lothar
6个回答

74

并发是指你的代码同时执行多个任务。通常可以使用显式“线程”来实现,但也有其他可能性。例如,如果您在代码中使用OpenMP指令,支持OpenMP的编译器将自动为您生成线程。

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

In 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::mutex, std::recursive_mutex等)
  • 锁定类方便管理锁定生命周期 (std::lock_guard<>, std::unique_lock<>)
  • std::lockstd::try_lock函数,可同时管理获取多个锁定而不会有死锁风险,
  • 条件变量以便轻松等待事件(std::condition_variable, std::condition_variable_any)
  • 期货(futures)、承诺(promises)和打包任务(packaged tasks),以简化在线程之间传递数据并等待一个值准备就绪。这解决了经典问题“如何从线程返回值”的问题。
  • 本地静态对象的线程安全初始化,
  • thread_local关键字声明线程本地数据。

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

我在我的博客上写关于C++多线程和并发方面的文章。我还正在撰写一本有关此主题的书:C++ Concurrency in Action


1
现在C++11已经发布,还能添加什么吗?我可以想象我们现在可以使用移动语义吗? - Damian
是的,您可以在std::threadstd::async中使用移动语义。 - Anthony Williams

17

当你说“C++新标准如何促进并发编程”时,我假设你在谈论即将发布的C++09标准。

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

  • 原子类型和地址
  • 线程类
  • 线程本地存储(该功能在几个月前才被添加到草案标准中)
  • 互斥锁(mutex类)
  • 条件变量-这对于Windows来说特别好,因为在Win32中实现条件变量很难。这意味着最终Microsoft应该至少在MSVC++运行库中提供对条件变量的支持,因此可以轻松地获得正确的条件变量语义在WIn32上。

有人写了关于这些功能的好概述吗? - Martin York
我认为它们在很大程度上基于boost::thread,因此那份文档与新标准之间应该没有太大的区别。 - gbjbaanb

5

并发是指在一个进程中具有多个执行线程。目前,C++不直接支持并发。但是,存在许多库可以将给定的函数绑定到新的执行线程上。Unix标准是pthreads库。


1
Posix标准(不是Unix) - Martin York
有人能解释一下为什么会有两个争议的答案吗:是的,C++是一种并发语言(上面),不,并发是另一回事(这个)?谁错了? - Martian

5

C++CSP2 - 为C++提供简单的并发性

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

CSP是一种基于适当并发范式的编程方法,与线程、锁定和其他事后添加的方式不同。

(请参见Occam-Pi,这是一种基于CSP的并发编程语言)


3

我有一些略微不同的看法,特别是有关编程范例未来方向的:

并发编程是指编写程序时考虑到硬件支持多任务处理的能力。目前,大多数语言都具有相对繁重和复杂的机制,以便让程序员指定这种能力(例如:线程与手动同步,OpenMP预处理指令等)。

随着硬件的改进,它将朝着横向(更多核心)而非纵向(更快的单个核心)方向发展。这意味着应用程序需要具备“潜在并发性”才能随着“更快”的硬件进行扩展。语言目前正试图发展以最好地支持这一点,以成为未来开发的最佳语言。

C++0x正在增加更多内置支持“旧”方法来实现并发编程。各种编译器供应商正在添加“新”方法,该方法抽象出线程模型,并允许运行时决策线程数量等(根据计算机的硬件情况);尤其是针对Microsoft,可以看到F#、并发运行时、平行扩展等方式。

希望这有所帮助。


1

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

阅读后,您将全面了解并发编程和C++。

简要概述,可以说并发编程是进行多任务处理。当程序被阻塞时,它可以做其他事情。通常我们在等待网络连接和处理I/O时会被阻塞。我们可以使用fork()和线程库来促进并发编程。


2
你发布的链接返回了404错误。 - xyres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接