IT序号网

c++之C中的多线程-WINAPI

wyy 2025年05月04日 编程语言 58 0

我正在尝试制作一个简单的程序,该程序创建4个线程,每个线程必须循环执行1000次,并且每次打印其线程号(1至4)及其在循环中的位置。
我写了这段代码,但是根本不起作用(打印出奇怪的东西)。如果有人会帮助我发现我的错误,我将感到很高兴。

#include <iostream> 
#include <windows.h> 
 
DWORD WINAPI threadFunc(LPVOID lparam) 
{ 
    INT num = *(PINT)lparam; 
    for (INT i = 0; i <= 1000; i++) 
    { 
        printf("Thread %d, var = %d\n", num, i); 
    } 
    return 1; 
} 
int main() 
{ 
    INT num1 = 1; 
    INT num2 = 2; 
    INT num3 = 3; 
    INT num4 = 4; 
 
    HANDLE h[4]; 
    h[0] = CreateThread( 
        NULL, 
        0, 
        threadFunc, 
        &num1, 
        0, 
        NULL); 
    h[1] = CreateThread( 
        NULL, 
        0, 
        threadFunc, 
        &num2, 
        0, 
        NULL); 
    h[2] = CreateThread( 
        NULL, 
        0, 
        threadFunc, 
        &num3, 
        0, 
        NULL); 
    h[3] = CreateThread( 
        NULL, 
        0, 
        threadFunc, 
        &num4, 
        0, 
        NULL); 
    WaitForMultipleObjects( 
        4, 
        h, 
        TRUE, 
        INFINITY); 
     
} 

请您参考如下方法:

您的WaitForMultipleObjects调用中的最后一个参数的值不正确!常量INFINITY(由math.h或其“子级”之一定义为((float)(_HUGE_ENUF * _HUGE_ENUF)))是一个浮点常量,用于检测与溢出相关的内容。
应该使用来代替,它是INFINITE常数(在WinBase.h中定义为0xFFFFFFFF)。 (一个字母可以带来多大的改变!)
启用完整的编译器警告后,您会发现这一点! MSVC为您的代码提供:

warning C4244: 'argument': conversion from 'float' to 'DWORD', possible loss of data


通过上述更改,当我在Windows 10(64位)上使用Visual Studio 2019测试它时,您的代码将按预期运行。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!