互斥对象、事件对象、关键代码段 (三)

2014-11-24 02:51:52 · 作者: · 浏览: 12
hread data
);

// 全局票数
int gTicket = 100;

// 关键代码段
CRITICAL_SECTION gSection;


int main()
{

// 初始化关键代码段,必须先于线程的创建
InitializeCriticalSection(&gSection);

// 创建两个线程句柄
HANDLE hThread1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);
HANDLE hThread2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);

// 关闭两个线程句柄
CloseHandle(hThread1);
CloseHandle(hThread2);

// 主线程sleep 4秒
Sleep(4000);

// 删除关键代码段
DeleteCriticalSection(&gSection);

system("pause");
return 0;
}

// 定义两个线程函数
DWORD WINAPI ThreadProc1(LPVOID lpParameter )
{
while(true)
{
EnterCriticalSection(&gSection); // 进入关键代码段
if(gTicket > 0)
{
cout<<"thread1 sell ticket "< }
else
{
break;
}
LeaveCriticalSection(&gSection); // 离开关键代码段
}
return 0;
}

DWORD WINAPI ThreadProc2(LPVOID lpParameter )
{
while(true)
{
EnterCriticalSection(&gSection); // 进入关键代码段
if(gTicket > 0)
{
cout<<"thread2 sell ticket "< }
else
{
break;
}
LeaveCriticalSection(&gSection); // 离开关键代码段
}
return 0;
}
程序运行的结果,相信大家都已经很清楚了,但是,前面两个内核对象(互斥对象、事件对象)的结果有点出乎意料。

以事件对象为例。用断点调试,竟然发现了这样的问题。线程1的函数获取互斥对象的拥有权(并未释放拥有权),接着切换CPU时间片,进入到了线程2函数的WaitForSingleObject,然后调用了线程2函数的 cout<<"thread2 sell ticket "<

使用互斥对象,显示的结果有时候会是这样。百思不得其解。

\