【问题标题】:Multithreading program executing only last created thread?多线程程序只执行最后创建的线程?
【发布时间】:2015-01-12 15:03:50
【问题描述】:

我创建了 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;
}

【问题讨论】:

  • 数组在 C 中是零索引的。写入ThreadHandle[4] 是未定义的行为。
  • 并且代码不会使用当前的 {} 用法进行编译。并发控制台输出是 ...

标签: c++ c multithreading createthread


【解决方案1】:

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

而不是(LPVOID)&amp;i,传递(LPVOID)i,在线程内部,使用(int)param而不是*((int*)param)。在 C 中将指针转换为 int 和 back 是合法的(尽管如果滥用会很危险)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多