我正在尝试制作一个简单的程序,该程序创建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测试它时,您的代码将按预期运行。




