|
#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即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
|
|