奇怪的线程执行顺序?

sla*_*ast 3 c c++ multithreading pthreads

我写了一个小程序来查看创建线程所需的开销.

这是程序(我写得很快,所以它不是最好的):

#include <iostream>
#include <pthread.h>

void * lala(void * cake) {
 int * hi = (int *)cake;
 std::cout << *hi << '\n';
}

int main(void) {
 pthread_t thread;
 for (int i = 0;i < 10000;i = i + 1) {
  pthread_create(&thread,0,lala,&i);
 }
}
Run Code Online (Sandbox Code Playgroud)

它基本上启动10000个线程并传递它们的线程号,每个线程输出它的号码.

每次运行程序时输出都会改变,但是我注意到有一个部分从未改变过:

在输出结束时,我总是发现:

...
9994
9995
9996
9997
9998
9999
0
Run Code Online (Sandbox Code Playgroud)

这意味着第一个线程最后完成...

所以,我的朋友们,有没有人对这种现象有可能的解释?

Aja*_*jay 9

首先,您将局部变量的地址传递给线程,该线程不断变化.因此,当线程有时间阅读它时,内容i将会被更改.为什么你不能只传递i而不是&i,变量只有4个字节(即适合指针)?

其次,您不应该担心操作系统如何安排您的线程.