白话windows多线程同步之关键段
来源:互联网 发布:java获取项目端口号 编辑:程序博客网 时间:2024/04/28 15:11
引子:老王的果园比较大,请了一些工人来做事。最近,工人们向老王反应说上厕所时经常遇到这样的尴尬:自己还在厕所里面,别人却不知道里面有人,一股劲往里面钻,结果春光乍泄,嘎嘎。老王立马给厕所门上了一把锁,并且钥匙就放在厕所里面可以够着的地方,有人来上厕所时,先拿着钥匙,然后将钥匙牢牢攥在手里,这样别人就不可能拿到钥匙。用完厕所之后,工人再将钥匙返回原处,这样后面的人就可以进去了。哈哈,老王的这个措施还不错吧,从此再也没有人同时进入厕所了。
今天要讲的关键段与老王的措施是类似的。下面给出代码:
#include "stdafx.h"#include <Windows.h>#include <process.h>CRITICAL_SECTION g_cs ;DWORD WINAPI WC(LPVOID lp){EnterCriticalSection(&g_cs) ;printf("%d is wc now!!!,please wait!\n", GetCurrentThreadId()) ;Sleep(1000) ;printf("%d has finished wc !!!,anyone could come now!\n\n\n", GetCurrentThreadId()) ;LeaveCriticalSection(&g_cs) ;return 0 ;}int _tmain(int argc, _TCHAR* argv[]){InitializeCriticalSection(&g_cs) ;CreateThread(NULL, 0, WC, NULL, 0, NULL) ;CreateThread(NULL, 0, WC, NULL, 0, NULL) ;while(TRUE){}return 0;}下面给出分析:
主线程创建了两个都要去上厕所的线程,线程中,EnterCriticalSection(&g_cs)相当于拿到了厕所钥匙,然后紧紧攥着手里,否则会发生悲剧的。用完厕所之后调用LeaveCriticalSection(&g_cs),相当于把钥匙返回原处,这样别人也能够拿到钥匙。结构是不是很清晰呢。下面是程序结果:
如果不用上面的限定,将会是下面的结果:
你看,两个人都进入厕所了,还叫别人等待,是不是发生悲剧了呢,~~~~(>_<)~~~~
说明:现在windows多线程同步的方法已基本讲完了。我所讲的这一系列的博客,都只是进行的比较基础的介绍,旨在给那些刚刚接触到windows多线程的人一点点帮助。您若是从这一系列博客中对windows多线程同步有了最初的了解,那么我的目的也就达到了。windows多线程同步是一个比较复杂的技术,实际情况而又非上面介绍的情况那么简单。比如使用关键段时很容易出现死锁,各个方法的优缺点也没有介绍,打算以后再写一些博文详细介绍这些。
1 0
- 白话windows多线程同步之关键段
- 白话windows多线程同步之事件对象
- 白话windows多线程同步之信号量
- Windows多线程程序设计之线程同步分析(结合临界区(关键代码段))
- 多线程之五 经典线程同步 关键段CS
- 多线程三 经典线程同步之关键段CS
- 多线程第三篇 经典线程同步之关键段CS
- 多线程三 经典线程同步之关键段CS
- 秒杀多线程-经典线程同步之关键段CS
- 白话windows多线程同步之互斥变量
- 白话windows多线程同步之可等待计时器内核对象
- 线程同步之关键段
- Windows多线程学习(二)多线程互斥同步 关键段解决互斥问题
- 多线程之CS(关键段)
- 利用关键代码段实现多线程同步
- Windows多线程同步系列之二-----关键区
- windows下多线程同步(利用事件对象,互斥对象,关键代码段)实现
- windows多线程系列004 利用关键代码段实现线程同步
- iOS framework
- HDU 1253 胜利大逃亡 (BFS,剪枝)
- arraylist
- CoffeeScript不是一门值得学习的语言
- Android中layout.xml文件中加载自定义的View类
- 白话windows多线程同步之关键段
- 可视化用户用户界面
- Block编程值得注意的那些事儿
- 好开心,看到喜欢的女孩子了
- 解决eclipse中对于中文字符的识别问题
- 第14周项目一
- 博客之路——第一步
- 指针、引用的区别和联系
- week 14