C ++ 11多线程:为什么结果并不总是一样的?

时间:2015-08-20 15:22:01

标签: c++ multithreading c++11

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

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

我通过保持代码相同来多次运行代码。虽然我使用的是++i而不是i++,但我认为这并不重要。问题是,我观察到相同代码的不同类型的输出。当我按0-9顺序传递参数时,我期望输出中的顺序结果。但每次运行代码时它都不同。为什么?背景中究竟发生了什么?

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

enter image description here

这是另一个: enter image description here

3 个答案:

答案 0 :(得分:2)

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

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

当然,这都是基于对可用资源和可能发生的资源的猜测。你为什么对此有任何期望?

答案 1 :(得分:2)

并行执行是非确定性的。为什么会出现这种情况的原因和种类很多,但其基本要点是线程由底层操作系统控制,操作系统可以在线程需要运行时以及何时运行时有许多优先级/假设他们没有,而且很少有这些变量暴露给用户。

如果绝对需要在另一个项目之前运行一个项目,则需要以串行方式运行,或者以其他方式运行一些更智能的编程范例。

答案 2 :(得分:1)

因为您实际上无法预测线程调度程序何时将调度哪个线程。它只是安排他们。 虽然您可以通过在该线程上调用join来强制处理特定线程。 线程感就是这样。