首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

没有搞懂老帖子,关于WaitforsingleObject解决方案

2012-04-30 
没有搞懂老帖子,关于WaitforsingleObjectC/C++ code老帖子没有搞懂,关于WaitforSingleObjectwaitforsingle

没有搞懂老帖子,关于WaitforsingleObject

C/C++ code
老帖子没有搞懂,关于WaitforSingleObjectwaitforsingleObject(句柄,-1); 表示 当 句柄所指的东东有信号的时候,才会返回。。。。。这句话是来自windows核心编程上的。 这里的句柄是表示线程内核。不是Event.fun1Proc的代码可以看出,首先进入临界区,然后开始执行。。。。fun2Proc同理。但是事实上,线程根本没有运行!! 没有打印任何结果。  不少网友认为之所以没有执行线程,是因为CloseHandle和WaitforSingleObject顺序反了,颠倒过来,就可以了。。。别忘了,CreateThread 后,线程的内核对象是2,不是1,所以可以创建后,就CloseHandle.所以 颠倒顺序,没有说到点上。int tickets = 100;CRITICAL_SECTION criSection;int main(){    HANDLE hThread2;    HANDLE hThread1;    InitializeCriticalSection(&criSection);    hThread1 = CreateThread(NULL,0,Fun1Proc1,NULL,0,NULL);    hThread2 = CreateThread(NULL,0,Fun1Proc2,NULL,0,NULL);    CloseHandle(hThread1);    CloseHandle(hThread2);    WaitForSingleObject(hThread1,-1);    WaitForSingleObject(hThread2,-1);    DeleteCriticalSection(&criSection);    return 0 ;}DWORD WINAPI Fun1Proc1(    LPVOID lpParameter   // thread data    ){    while(TRUE)    {        EnterCriticalSection(&criSection);        if(tickets>0)        {            Sleep(1);            cout<<"thread1 sell ticket : "<<tickets--<<endl;        }        else{            LeaveCriticalSection(&criSection);            break;        }        LeaveCriticalSection(&criSection);    }    return 0;}DWORD WINAPI Fun1Proc2(    LPVOID lpParameter   // thread data    ){    while(TRUE)    {        EnterCriticalSection(&criSection);        if(tickets>0)        {            Sleep(1);            cout<<"thread2 sell ticket : "<<tickets--<<endl;        }        else {            LeaveCriticalSection(&criSection);            break;        }        LeaveCriticalSection(&criSection);    }    return 0;}


[解决办法]
closehandle后句柄就是无效的,必须放wait后面
[解决办法]
线程没有机会执行主要原因是主线程结束,整个进程就退出了,你可以再主线程里Sleep一下。
你在WaitForSingleObject之前CloseHandle()关闭窗口句柄,WaitFor函数调用应该失败,错误应该是句柄无效。所以主线程很快就执行结束,子线程就夭折了。。。
[解决办法]
WaitForSingleObject(hThread1,-1);
GetLastError()返回 ERROR_INVALID_HANDLE,说明CloseHandle使句柄无效,内核对象数递减。WaitForSingleObject失败。程序没有等待就返回,并执行DeleteCriticalSection,此时,critical section object被释放,如果线程还引用criSection会出现错误。线程可能还没执行到cout程序被退出。试试在WaitForSingleObject,后面加上Sleep(5000).
[解决办法]
探讨

晕,不是说了嘛,创建之后, 线程内核对象是2,所以可以理解关闭句柄

引用:

closehandle后句柄就是无效的,必须放wait后面

热点排行