现在的位置: 首页 > 综合 > 正文

白话windows多线程同步之关键段

2018年03月15日 ⁄ 综合 ⁄ 共 1156字 ⁄ 字号 评论关闭

引子:老王的果园比较大,请了一些工人来做事。最近,工人们向老王反应说上厕所时经常遇到这样的尴尬:自己还在厕所里面,别人却不知道里面有人,一股劲往里面钻,结果春光乍泄,嘎嘎。老王立马给厕所门上了一把锁,并且钥匙就放在厕所里面可以够着的地方,有人来上厕所时,先拿着钥匙,然后将钥匙牢牢攥在手里,这样别人就不可能拿到钥匙。用完厕所之后,工人再将钥匙返回原处,这样后面的人就可以进去了。哈哈,老王的这个措施还不错吧,从此再也没有人同时进入厕所了。

今天要讲的关键段与老王的措施是类似的。下面给出代码:

#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多线程同步是一个比较复杂的技术,实际情况而又非上面介绍的情况那么简单。比如使用关键段时很容易出现死锁,各个方法的优缺点也没有介绍,打算以后再写一些博文详细介绍这些。

抱歉!评论已关闭.