读书人

Critical_section用法,该怎么处理

发布时间: 2012-03-05 11:54:02 作者: rapoo

Critical_section用法
#include <windows.h>
#include <stdio.h>

struct wo {
int ii;
int jj;
};

CRITICAL_SECTION cs;

DWORD WINAPI testout(LPVOID lparam)
{
EnterCriticalSection(&cs);
wo de=*(wo*)lparam;
printf( "%d------%d is running!\r\n ",de.ii,de.jj);
LeaveCriticalSection(&cs);
return 0;
}

void main()
{
InitializeCriticalSection(&cs);
wo wode[110];
int num=0;

HANDLE hThread[110];
for(int i=0;i <10;i++)
{
for(int j=0;j <10;j++,num++)
{
wode[num].ii=i;
wode[num].jj=j;
hThread[num]=CreateThread(NULL,0,testout,(LPVOID)&wode[num],0,NULL);
}
}
WaitForMultipleObjects(num,hThread,TRUE,INFINITE);
for(i=0;i <num;i++)
CloseHandle(hThread);
DeleteCriticalSection(&cs);
return;
}


大家帮忙看下,为什么有时是对的有时不对?


[解决办法]
你的代码问题多得很啊,

WaitForMultipleObjects 可等待的句柄数是有限制的,为MAXIMUM_WAIT_OBJECTS, 这个值

关闭内核对象应该是一个一个来的,所以要用hThread[i];
CloseHandle(hThread); ===> CloseHandle(hThread[i]);

而且你线程一创建完你就CloseHandle, 有些线程根本来不及执行,这个时候你CloseHandle就有问题,所以会出现不对.
应该在WaitForMultipleObjects后面加一句Sleep(10000); 等待十秒钟,等线程执行完了你再CloseHandle,这个时候就不会有问题的.

读书人网 >C++

热点推荐