孙鑫教程里的一个有关问题
孙鑫教程里的一个问题
在第十六章《线程同步与异步套接字编程》的16.2.2小节:利用关键代码段实现线程同步
我照抄着孙鑫的代码,为什么执行起来有错?对照了好几遍,没有发现哪儿出错。代码如下:
执行结果:

谁知道这是什么问题?
------解决方案--------------------
InitializeCriticalSection(&g_cs);
这个放到CreateThread的前面做。
------解决方案--------------------
除了1楼说的原因外, 还有你那个DeleteCriticalSection(&g_cs);放的地方也不对, 因为线程还没有结束, 也就是说这个临界区还在使用, 就被你删除掉了, 那程序就可能崩溃了. 你可以尝试把那个Sleep改得长一点.
在第十六章《线程同步与异步套接字编程》的16.2.2小节:利用关键代码段实现线程同步
我照抄着孙鑫的代码,为什么执行起来有错?对照了好几遍,没有发现哪儿出错。代码如下:
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
int tickets = 100;
CRITICAL_SECTION g_cs;
void main()
{
HANDLE hThread1;
HANDLE hThread2;
//创建线程
hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
InitializeCriticalSection(&g_cs);
//让主线程睡眠4秒
Sleep(4000);
DeleteCriticalSection(&g_cs);
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while(TRUE)
{
EnterCriticalSection(&g_cs);
Sleep(1);
if (tickets > 0)
{
Sleep(1);
cout << "thread1 sell ticket:" << tickets-- << endl;
LeaveCriticalSection(&g_cs);
}
else
{
LeaveCriticalSection(&g_cs);
break;
}
}
return 0;
}
DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while(TRUE)
{
EnterCriticalSection(&g_cs);
Sleep(1);
if (tickets > 0)
{
Sleep(1);
cout << "thread2 sell ticket:" << tickets-- << endl;
LeaveCriticalSection(&g_cs);
}
else
{
LeaveCriticalSection(&g_cs);
break;
}
}
return 0;
}
执行结果:
谁知道这是什么问题?
多线程
孙鑫
MFC
------解决方案--------------------
InitializeCriticalSection(&g_cs);
这个放到CreateThread的前面做。
------解决方案--------------------
除了1楼说的原因外, 还有你那个DeleteCriticalSection(&g_cs);放的地方也不对, 因为线程还没有结束, 也就是说这个临界区还在使用, 就被你删除掉了, 那程序就可能崩溃了. 你可以尝试把那个Sleep改得长一点.