从一个多线程的例子,来理解Sleep的机制和用法
来源:互联网 发布:mac 数学公式编辑器 编辑:程序博客网 时间:2024/05/19 19:41
这个例子是两个线程用于售票,保证轮流售票的有序性。
#include <windows.h>#include <iostream>DWORD WINAPI Fun1Proc(LPVOID lpParameter);//线程1DWORD WINAPI Fun2Proc(LPVOID lpParameter);//线程2int tickets=60000;//总票数HANDLE hMutex;//主函数void main(){ HANDLE hThread1; HANDLE hThread2; hMutex=CreateMutex(NULL,TRUE,"tickets"); //创建互斥锁 //...省略对锁创建是否成功的检查 ReleaseMutex(hMutex); //释放该互斥锁,否则子线程得不到该锁,子线程一直WaitForSingleObject(hMutex,INFINITE); hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); //创建,启动线程1 hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL) ; //创建,启动线程2 CloseHandle(hThread1); CloseHandle(hThread2); Sleep(500000); //主线程必须有足够的时间保证子线程执行完毕,否则程序崩溃}//线程1的入口函数DWORD WINAPI Fun1Proc(LPVOID lpParameter){ while (true) { ReleaseMutex(hMutex); WaitForSingleObject(hMutex,INFINITE); if (tickets>0) { Sleep(1); cout<<"thread1 sell ticket :"<<tickets--<<endl; } else break; ReleaseMutex(hMutex); } return 0;}//线程2的入口函数DWORD WINAPI Fun2Proc(LPVOID lpParameter){ while (true) { ReleaseMutex(hMutex); WaitForSingleObject(hMutex,INFINITE); if (tickets>0) { Sleep(1); cout<<"thread2 sell ticket :"<<tickets--<<endl; } else break; ReleaseMutex(hMutex); } return 0;}
关于使用Sleep的一些看法:
(1)不用Sleep并且线程不阻塞,Sleep(1)可以使得CPU的负荷减少接近40%
(2)Sleep(0)触发操作系统重新进行一个CPU竞争,即重新调度。操作系统监控有线程霸占CPU的情况, 如果发现,就强制挂起该线程。在这个程序中,主线程Sleep(500000),就可以看作是长期霸占CPU的情况。
(3)如果主线程Sleep的时间,不足以执行完子线程的任务,主线程强制退出并释放资源则子线程非正常退出, 于是整个程序崩溃掉。
(4)Sleep的作用是忙等,谁调用它谁就睡觉,时间到了以后该线程进入就绪队列。
其他概念:
(1)wait和Sleep的区别:Sleep一段时间后自己唤醒自己,之后进入到就绪队列,wait在线程池中等待, 需要被迫的notify还需要系统分配资源时间上要比Sleep多一些。
(2)suspend和block不是忙等,碰到后立刻返回。需要另一个外来事件唤醒。
(3)在主线程中CreateMutex,主线程持有Mutex,也就是谁持有谁ReleaseMutex,否则子线程永远得不 到该锁,并且一直等待获取该锁。
欢迎大家在该话题的基础上发表自己的看法,或是改进的意见!
欢迎访问:http://blog.csdn.net/cuishumao/article/details/10094823
- 从一个多线程的例子,来理解Sleep的机制和用法
- 多线程等待唤醒机制:从wait()和sleep()的差别说起
- 一个例子理解生成器的用法
- 用一个例子来理解MATLAB中的cell,理解{}和()的区别
- 多线程的sleep和wait
- 多线程的wait()和sleep()
- 多线程的一个例子
- 多线程的一个例子
- 从一个MysqL的例子来学习查询语句
- 从一个MysqL的例子来学习查询语句
- 对 Message 和 Handle 的机制理解 必须写一个例子学习
- Jena的简单理解和一个例子
- Jena的简单理解和一个例子
- 多线程:一个理解wait()与notify()的例子
- 从一个简单的例子谈谈package与import机制
- 从一个简单的例子谈谈package与import机制
- 这有一个很好的例子,有助于理解事件机制。
- 这有一个很好的例子,有助于理解事件机制。
- 实战 windows7 下 eclipse 远程调试 linux hadoop
- how-to-learn-machine-learning
- VMware发布大数据扩展 试图虚拟化Hadoop
- 模态对话框的消息机制
- 项目估算与计划不是一般的难!(6)——如何跟踪计划?
- 从一个多线程的例子,来理解Sleep的机制和用法
- Properties/Property文件读取(键值均)乱码问题!
- 抽奖时间倒计时js特效代码
- JSP输出HTML时产生的大量空格和换行的去除方法
- JDBC连接之Sybase数据库
- C# 连接数据库的异常捕获
- 简单的tomcat内存监控报警
- DSP基础算法与模型研究
- Storm