死锁问题

来源:互联网 发布:waifu2x caffe 编辑:程序博客网 时间:2024/06/05 20:49


// 模拟车站售票问题,两个窗口交替售票,这里使用关键段做线程的同步

// 死锁问题#include <Windows.h>#include <process.h>#include <iostream>using namespace std;CRITICAL_SECTION g_hSectionA;CRITICAL_SECTION g_hSectionB;int g_ticket = 100;void seller1(LPVOID pvoid) // 线程1{while (TRUE) {EnterCriticalSection(&g_hSectionA); // 代码行1//Sleep(10);EnterCriticalSection(&g_hSectionB); // 程序段1if (g_ticket>0){cout << "售出第" << g_ticket-- << "票" << endl;}elsebreak;LeaveCriticalSection(&g_hSectionB);LeaveCriticalSection(&g_hSectionA);}}void seller2(LPVOID pvoid) // 线程2{while (TRUE) {EnterCriticalSection(&g_hSectionB); // 代码行2//Sleep(10);EnterCriticalSection(&g_hSectionA); // 程序段2if (g_ticket>0){cout << "售出第" << g_ticket-- << "票" << endl;}elsebreak;LeaveCriticalSection(&g_hSectionA);LeaveCriticalSection(&g_hSectionB);}}int main(){InitializeCriticalSection(&g_hSectionA);InitializeCriticalSection(&g_hSectionB);_beginthread(seller1, 0, NULL);_beginthread(seller2, 0, NULL);Sleep(4000);DeleteCriticalSection(&g_hSectionA);DeleteCriticalSection(&g_hSectionB);system("pause");return 0;}

这里如果将上文中的 sleep(1)反注释,就会产生死锁的问题。因为假如先执行到 “代码行1”,遇到sleep(1), 线程1休眠,开始执行 “代码行2”,同样遇到sleep(1),线程2休眠,这时开始执行到 "程序段1",由于关键段 g_hSectionB在执行 “代码行2”信号被隐藏,此时处于无信号状态,停止往下执行。线程2休眠结束,开始执行"程序段2",同样由于关键段变量 g_hSectionA无信号释放,线程2停止执行.进入死循环。





0 0
原创粉丝点击