创建线程的数量问题
代码大致如下:
#define N 65
HANDLE hMutex;
int c;
void f()
{
WaitForSingleObject(hMutex, INFINITE);
c++;
ReleaseMutex(hMutex);
}
int main()
{
HANDLE t[N];
for (int i = 0; i < N; i++)
{
t[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)f, NULL, 0, NULL);
}
WaitForMultipleObjects(N, t, TRUE, INFINITE);
cout << "c = " << c << "\n\n";
}
发现c最终的结果不是65.如果将N改为小于65,那么输出就正常了。如果创建线程大于等于65,那么有一部分线程并没有被创建。请问这是怎么回事儿?
[最优解释]
我感觉循环里可以加个sleep
[其他解释]
因为还没来的及启动那些线程 你已经WaitForMultipleObjects收到无信号返回了
for里加个Sleep(20)就可以了
[其他解释]
Return Values
If the function succeeds, the return value is a handle to the new thread.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.
[其他解释]
改成这样试下
void f()
{
//WaitForSingleObject(hMutex, INFINITE);
c++;
//ReleaseMutex(hMutex);
}
[其他解释]
不好意思,问题描述有问题。线程是全部创建好了,但是并不是所有的线程都执行了。如果N大于等于65,那么每次运行的结果都不同。如果N小于65,那么结果就是对的。GetLastError返回0。
这个要解决互斥问题。
[其他解释]
说明当前创建65个线程 后面的程序还没执行cpu就回到主线程了 WaitForMultipleObjects认为那些没启动
的线程已经执行完成了...
[其他解释]
这跟Sleep没关系,因为WaitForMultipleObjects是等待所有线程结束后,才继续往下执行。以防万一,试了你的方法,可是每次c的值都为0……
奇怪的是,如果N小于65,那么就一切正常了。
[其他解释]
果然是这样,之前把你说的理解错了,多谢。