Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+的多线程模型+;11_C++_Multithreading_C++11 - Fatal编程技术网

C++ C+的多线程模型+;11

C++ C+的多线程模型+;11,c++,multithreading,c++11,C++,Multithreading,C++11,我想更多地了解c++11多线程模型。通过谷歌搜索,我可以找到很多例子、演示等,但有些东西对我来说并不明显 我们在大学的操作系统课程中研究了线程概念。当然,这与特定的实现或语言无关。以下段落来自亚伯拉罕·西尔伯沙茨、格雷格·加涅和彼得·贝尔·加尔文,“操作系统概念,第八版”,第4章: 4.2多线程模型 在现代系统中,有两种类型的线程需要管理:用户线程和内核线程。 在内核之上支持用户线程,而不支持内核。这些是应用程序程序员将要使用的线程 加入他们的计划 操作系统本身的内核支持内核线程。所有现代操作系

我想更多地了解c++11多线程模型。通过谷歌搜索,我可以找到很多例子、演示等,但有些东西对我来说并不明显

我们在大学的操作系统课程中研究了线程概念。当然,这与特定的实现或语言无关。以下段落来自亚伯拉罕·西尔伯沙茨、格雷格·加涅和彼得·贝尔·加尔文,“操作系统概念,第八版”,第4章:

4.2多线程模型

在现代系统中,有两种类型的线程需要管理:用户线程和内核线程。 在内核之上支持用户线程,而不支持内核。这些是应用程序程序员将要使用的线程 加入他们的计划

操作系统本身的内核支持内核线程。所有现代操作系统都支持内核级线程,允许内核

  • 同时执行多个任务和/或为多个内核提供服务
  • 系统同时调用
在特定实现中,必须使用以下策略之一将用户线程映射到内核线程:

4.2.1多对一模型

4.2.2一对一模型

4.2.3多对多模型


那么c++11支持哪种模型呢?AFAIK
c++
不应该在特定种类的操作系统中使用。因此,标准库应该只支持用户空间线程,对吗?

关于您询问的问题(即用户级或内核级线程及其实现),C++11标准没有指定任何内容。因此,任何遵循标准规则的实现(也可能是您提到的任何一种实现——这些规则与线程模型的实现细节无关)都将继续。当然,如果您编写一个用户空间程序,它自然会遵循C++11线程将是用户空间线程。但是该标准对“用户空间”或“内核空间”一无所知,因此如果您选择在C++11中实现操作系统内核,那么线程将是(自然如上)内核线程


从某种意义上说,C++11标准不支持这些线程模型(例如,没有API来获取线程并指定“这必须是内核线程,或单独的lwp或其他东西”)。另一方面,它支持所有这些(例如,线程库上的任何用户内核线程映射概念可以提供C++ 11线程)。更详细地说,C++实现可能使用用户的TRAIL或内核线程或其标准库实现中的任何组合,并且仍然是一致的,所以一个符合C++的应用程序不应该关心什么样的线程模型被用在“引擎盖下”,我偶然发现了这个问题。我认为您误解了用户线程和内核线程这两个术语。据我所知,内核线程是真正的线程。它们通过系统调用创建,并由操作系统安排。如果系统有多个内核,它们甚至可以同时运行。相反,用户线程由应用程序本身处理。由于缺少功能,它们无法同时运行。除了后台有内核线程。要更改当前用户线程,必须调用
yield