gpt4 book ai didi

c++ - 多线程程序只执行最后创建的线程?

转载 作者:太空宇宙 更新时间:2023-11-04 05:25:53 26 4
gpt4 key购买 nike

我已经创建了 4 个线程,但是当我执行这个程序时,我得到这个作为输出:

Thread #: 1  
Thread #: 2
Thread #: 3
Thread #: 3
Thread #: 4
Thread #: 4
Thread #: 4
Thread #: 5
Thread #: 5
Thread #: 5
.
.
.
Thread #: 5
Thread #: 5

我有两个问题:

  1. 我只创建了 4 个线程,为什么显示线程 #: 5
  2. 创建的所有 4 个线程应该按顺序运行,但为什么它只运行最后创建的线程?

源代码:

#include<windows.h>


HANDLE ThreadHandle[4];
DWORD dwThreadId[4];

DWORD WINAPI ThreadFunction(LPVOID param)
{

while (1)
{

printf("Thread #: %d\n", *((int*)param));
}

Sleep(10);

return 0;
}

int main()
{
static int i = 0;
for (i = 1; i <= 4; i++)
{
ThreadHandle[i] = CreateThread(NULL, 0, ThreadFunction, (LPVOID)&i, 0, &dwThreadId[i]);
Sleep(10);

}
while (1)
{
Sleep(100);
}
return 0;
}

最佳答案

i 是一个静态变量 - 只有一个实例。您将其地址传递给线程并在每次调用 printf 时取消引用它。因此,当主线程更改 i 的值时,所有 工作线程会立即看到新值。正是出于这个原因,您会看到线程 #5 - 这是 for() 循环结束后 i 的值。

代替(LPVOID)&i,传递(LPVOID)i,在线程内部,使用(int)param代替*((int*)参数)。将指针转换为 int 并返回在 C 中是合法的(尽管如果使用不当会很危险)。

关于c++ - 多线程程序只执行最后创建的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27904946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com