c++ - 奇怪的线程执行顺序?

标签 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);
 }
}

它基本上启动了 10000 个线程并将它们的线程编号传递给它们,然后每个线程输出它的编号。

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

在输出的最后,我总能找到这个:

...
9994
9995
9996
9997
9998
9999
0

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

那么, friend 们,有没有人对这种现象有可能的解释?

最佳答案

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

其次,您不必担心操作系统如何安排您的线程。

关于c++ - 奇怪的线程执行顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6632453/

相关文章:

c++ - 遍历堆栈

c++ - 将格式设置从一个流复制到另一个流

c++ - CRT 参数验证使多线程调试程序崩溃

java - Android:如何创建二维数组的副本以在另一个线程中使用?

c++ - 找出继承对象的类

c++ - 采用 nulltpr_t : function definition does not declare parameters 的构造函数

c - 从 parent 向 child 发送信号

c - 在计算字符数后输入文本和 malloc 可能吗? ( C )

c - 如何从 C 中的 X11 窗口获取 Vulkan 上下文?

swift - 如何在滚动时更新计时器上的 UITableView