#include <stdio.h> BOOL g_bContinue = TRUE; CRITICAL_SECTION g_cs; // 对存在同步问题的代码段使用临界区对象 UINT __stdcall ThreadFunc1(LPVOID paccept) ; void main() // 初始化临界区对象 // 等待1秒后通知两个计数线程结束,关闭句柄 ::CloseHandle(h[0]); // 删除临界区对象 UINT __stdcall ThreadFunc2(LPVOID paccept) |
|
20分 |
开启线程前就得初始化关键区对象
void main() { // 初始化临界区对象 ::InitializeCriticalSection(&g_cs); UINT uId; HANDLE h[2]; int a[2] = { 0,1 }; h[0] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc1, &a[0], 0, &uId); h[1] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc2, &a[1], 0, &uId); // 等待1秒后通知两个计数线程结束,关闭句柄 Sleep(1000); g_bContinue = FALSE; ::WaitForMultipleObjects(2, h, TRUE, INFINITE); ::CloseHandle(h[0]); ::CloseHandle(h[1]); // 删除临界区对象 ::DeleteCriticalSection(&g_cs); } |
这个是错误提示的结果:
|
|
非常感谢zhangxiangDavaid ,问题立马解决,果然大神。
|
|
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
|