我写了一个小程序来查看创建线程的开销量。
这是程序(我写得很快,所以不是最好的):
#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);
}
}
它基本上启动了 10000 个线程并将它们的线程编号传递给它们,然后每个线程输出它的编号。
每次运行程序时输出都会改变,但我注意到有一部分从未改变:
在输出的最后,我总能找到这个:
...
9994
9995
9996
9997
9998
9999
0
这意味着第一个线程最后完成...
那么, friend 们,有没有人对这种现象有可能的解释?
最佳答案
首先,您将局部变量的地址传递给线程,该地址不断变化。因此,当线程有时间读取它时,i
的内容将已经更改。
为什么不能只传递 i
而不是 &i
,其中变量只有 4 个字节(即适合指针)?
其次,您不必担心操作系统如何安排您的线程。
关于c++ - 奇怪的线程执行顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6632453/