Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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测试了一个简单的多线程程序。我使用g++-std=c++11-pthread thread.cpp-o thread&&./thread命令编译并运行代码到我的ubuntu终端 通过保持代码不变,我运行了几次代码。虽然我用了++I而不是I++,但我认为这并不重要。问题是,我观察到同一代码有不同的输出。当我按0-9顺序传递参数时,我希望输出中会出现顺序结果。但是每次我运行代码的时候都不一样。为什么?

我是多线程编程的初学者,所以目前我不清楚后台发生了什么。请帮助我理解以下场景-

我刚刚用C++ 11测试了一个简单的多线程程序。我使用
g++-std=c++11-pthread thread.cpp-o thread&&./thread
命令编译并运行代码到我的ubuntu终端

通过保持代码不变,我运行了几次代码。虽然我用了
++I
而不是
I++
,但我认为这并不重要。问题是,我观察到同一代码有不同的输出。当我按0-9顺序传递参数时,我希望输出中会出现顺序结果。但是每次我运行代码的时候都不一样。为什么?背景中到底发生了什么

以下是我的程序的代码和输出:

这里还有一个:

如果最有效的工作顺序恰好与您要求完成工作的顺序相匹配,那将是一个惊人的巧合

例如,考虑一个具有四个核心的系统。创建作业的代码在一个内核上运行。因此,我们可能期望前三个作业能够立即获得自己的核心。接下来的七个作业必须等待可用的内核。但是一旦我们创建了最后一个线程,运行最后一个作业是最有意义的,因为该线程在缓存中是热的。那么,调度程序为什么不运行最后一个作业呢


当然,这一切都是基于对哪些资源可用以及可能发生什么的猜测。你为什么会有这样的期望呢?

如果最有效的工作顺序恰好与你要求的工作顺序相匹配,那将是一个惊人的巧合

例如,考虑一个具有四个核心的系统。创建作业的代码在一个内核上运行。因此,我们可能期望前三个作业能够立即获得自己的核心。接下来的七个作业必须等待可用的内核。但是一旦我们创建了最后一个线程,运行最后一个作业是最有意义的,因为该线程在缓存中是热的。那么,调度程序为什么不运行最后一个作业呢


当然,这一切都是基于对哪些资源可用以及可能发生什么的猜测。为什么您会对此有任何期望?

因为您确实无法预测线程调度程序将在何时调度哪个线程。它只是安排它们。 尽管您可以通过在特定线程上调用
join
来强制在该线程上工作。
线程的意义正是如此。

因为您确实无法预测线程调度程序何时将调度哪个线程。它只是安排它们。 尽管您可以通过在特定线程上调用
join
来强制在该线程上工作。
线程的意义正是如此。

并行执行是不确定的。造成这种情况的各种原因和理由在范围和种类上都是巨大的,但其基本要点是线程是由底层操作系统控制的,操作系统可以对线程何时需要运行和何时不需要运行有许多优先级/假设,并且很少有这些变量向用户公开


如果绝对有必要先运行一个项目,然后再运行另一个项目,则需要以串行方式运行,或者采用一些更智能的编程范例。

并行执行是不确定的。造成这种情况的各种原因和理由在范围和种类上都是巨大的,但其基本要点是线程是由底层操作系统控制的,操作系统可以对线程何时需要运行和何时不需要运行有许多优先级/假设,并且很少有这些变量向用户公开


如果绝对有必要先运行一个项目,然后再运行另一个项目,那么您需要以串行方式运行,或者采用一些更智能的编程范例。

您能否准确地解释一下为什么希望出现顺序结果。问题是你有一个毫无意义的期望,这就是线程的全部意义——它们并行运行,并且由操作系统独立调度。这使得独立线程的具体交错序列实际上是随机的。我建议只阅读关于线程调度的内容,正如David所说的,没有理由期望一致的结果,深入解释所有内容实在太广泛了。你给了一些人一个不同的数字,并告诉他们去跑马拉松。你为什么对这些数字不符合顺序感到惊讶?速度更快的人将首先越过终点线。谢谢大家。我明白。:)你能准确地解释为什么你期望一个连续的结果吗。问题是你有一个毫无意义的期望,这就是线程的全部意义——它们并行运行,并且由操作系统独立调度。这使得独立线程的具体交错序列实际上是随机的。我建议只阅读关于线程调度的内容,正如David所说的,没有理由期望一致的结果,深入解释所有内容实在太广泛了。你给了一些人一个不同的数字,并告诉他们去跑马拉松。你为什么对这些数字不符合顺序感到惊讶?速度更快的人将首先越过终点线。谢谢大家。我明白。:)