死锁问题
来源:互联网 发布: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
- 死锁问题
- 死锁问题
- 死锁问题
- 死锁问题
- 死锁问题
- 死锁问题
- 死锁问题
- 死锁问题
- 死锁问题
- 死锁问题
- 死锁问题
- 死锁问题
- 死锁问题
- 死锁问题?
- 死锁问题
- 死锁处理问题
- J2EE中的死锁问题
- Activemq死锁的问题
- ECMASCRIPT5 DOM Document类型详解
- jQuery Ajax: $.post请求实例
- 目标检测的图像特征提取之(一)HOG特征
- 静态成员——计算学生个数
- 目标检测的图像特征提取之(二)LBP特征
- 死锁问题
- jquery源码之属性判断-$.type类型
- 目标检测的图像特征提取之(三)Haar特征
- 互联网+的首要任务是拆围墙
- Xamarin.Forms系列文章(一):概述
- Gson数据解析
- Android自定义控件View的探讨
- java设计模式之——代理模式
- android ListView 在初始化时多次调用getView()原因分析