<MFC笔记>多线程编程之线程的特性
来源:互联网 发布:java等腰三角形代码 编辑:程序博客网 时间:2024/06/05 09:43
一,线程的特性
1,随机性,系统在执行多线程程序时只保证线程是交替执行的,至于哪个线程先执行哪个线程后执行,则无法获得保证,需要书写专门的代码才可以保证执行的顺序。2,多线程无法预测其行为,可能获得不同的结果。当然想要达到预期的效果需要xxx(暂时没有搞清楚)
3,task switches可能在任何时刻任何地点发生
4,线程对小的变化有高度的敏感
二,不可预测性和随机性
1,创建一个win32 console application工程,本工程创建了两个支线程,两个支线程执行模拟火车售票的程序!输入代码如下:
输入代码如下:#include "windows.h"#include "iostream.h"DWORD WINAPI FunProc1(LPVOID lpParameter);DWORD WINAPI FunProc2(LPVOID lpParameter);static int ticket=100;void main(){ HANDLE hThread1; HANDLE hThread2; hThread1=CreateThread(NULL,0,FunProc1,NULL,0,NULL); hThread2=CreateThread(NULL,0,FunProc2,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(4000);}DWORD WINAPI FunProc1(LPVOID lpParameter){while(TRUE){ if(ticket>0) { cout<<"ticket 1:"<<ticket--<<endl; } else break;}return 0;}DWORD WINAPI FunProc2(LPVOID lpParameter){while(TRUE){ if(ticket>0) { cout<<"ticket 2:"<<ticket--<<endl; } else break;}return 0;}
2,结果(以下均为未更改代码的前提下多次运行的结果)
图未接完,只展示前面的部分数据!
三,解决上诉现象
(利用互斥对象实现线程同步)
1,在上诉代码的基础上添加代码如下:红色为新添加的代码!
#include "windows.h"#include "iostream.h"DWORD WINAPI FunProc1(LPVOID lpParameter);DWORD WINAPI FunProc2(LPVOID lpParameter);static int ticket=100;HANDLE hMutex; //保存互斥对象void main(){ HANDLE hThread1; HANDLE hThread2; hMutex=CreateMutex(NULL,FALSE,NULL); //创建互斥对象,互斥对象可比喻成钥匙</span> hThread1=CreateThread(NULL,0,FunProc1,NULL,0,NULL); hThread2=CreateThread(NULL,0,FunProc2,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(4000);}DWORD WINAPI FunProc1(LPVOID lpParameter){while(TRUE){WaitForSingleObject(hMutex,INFINITE); //申请“钥匙”(即互斥对象)的所有权,一直等待 if(ticket>0) { Sleep(1); //让线程1暂停1毫秒</span> cout<<"ticket 1:"<<ticket--<<endl; } else break; ReleaseMutex(hMutex); //执行完后,释放所有权}return 0;}DWORD WINAPI FunProc2(LPVOID lpParameter){while(TRUE){ WaitForSingleObject(hMutex,INFINITE);</span> if(ticket>0) {Sleep(1); cout<<"ticket 2:"<<ticket--<<endl; } else break; ReleaseMutex(hMutex);}return 0;}
2,运行结果(多次运行的如果都是如此)
3,运行结果分析
(1)CreateMutex(NULL,FALSE,NULL)各参数的意义(顺序解释):默认安全性,创建该互斥对象的线程不获得这个互斥对象,创建一个匿名的互斥对象!一定要记住:谁拥有互斥对象,谁就必须释放!如果设置为TRUE则,必须在主程序释放互斥对象。
(2)WaitForSingleObject(hMutex,INFINITE):互斥对象,无限等待线程来请求互斥对象的所有权。当运行到这一句时线程1和线程2就会一直等待,除非所等待的互斥对象hMetux处于有信号状态(即没有被“别人”拿走了钥匙,或者说互斥对象没有被申请!)
(3)程序的执行过程:当第一个线程运行时,进入while循环,申请“钥匙”(此时钥匙没有被拿走),所以线程1得到了互斥对象(操作系统随后将互斥对象的线程id改为线程1的id),线程1便继续执行下去,调用sleep,暂停一小会,于是系统会选择线程2开始执行,该线程执行过程也一样!!!但是因为互斥对象已经被线程1所拥有,处于无信号状态所以线程2一直处于等待状态!线程1暂停结束,开始执行任务,最后释放所有权!线程2申请得到互斥对象,开始执行任务,然后释放......................
1 0
- <MFC笔记>多线程编程之线程的特性
- MFC多线程编程之四——线程的同步
- MFC多线程编程之四——线程的同步
- MFC多线程编程之四——线程的同步
- MFC多线程编程之四——线程的同步
- MFC多线程编程之四——线程的同步
- 孙鑫MFC笔记之十三--多线程编程
- mfc多线程编程之三——线程间通讯
- MFC多线程编程之三——线程间通讯
- MFC多线程编程之三——线程间通讯
- MFC多线程编程之三——线程间通讯
- MFC多线程编程之三——线程间通讯
- 多线程编程复习笔记 线程的创建
- 阅读笔记 多线程线程编程的目的
- MFC下的线程(Windows环境下的多线程编程)
- MFC下的线程(Windows环境下的多线程编程)
- MFC多线程之工作者线程
- MFC多线程之用户界面线程
- iOS 7.1使用企业应用部署方式无法安装app
- 第二次实验 快速排序 实习与工作
- 你知道为什么Xcode6中Swift没有智能提示和自动补全功能吗 ?
- CodeForces 405A
- 让Qt应用程序跑在Android上
- <MFC笔记>多线程编程之线程的特性
- 如何运行Spark官网中的Quick Start的例子 (20140610)
- 公司推 dotProject 失败 蚊子132 给大家总结原因
- 阿里集团发布“码上淘”战略,青岛啤酒尝头啖汤
- Android开发环境的搭建
- jsp导出excel文件并设定单元格格式
- Ubuntu 下开启防火墙
- GPIO驱动相关笔记
- 《深入浅出 Java Concurrency》—锁机制(五) 闭锁 (CountDownLatch)