首页 网尚 潮流 生活 网红 智家 车尚 潮机 酷码 影娱 移动客户端
用于同步Ccriticalsection同一时刻只允许一个线程存取
来源:亿尚网
作者:亿尚网编辑
时间:2020-09-07

类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。临界区在控制一次只有一个线程修改数据或其它的控制资源时非常有用。例如,在链表中增加一个结点就只允许一次一个线程进行。通过使用CCriticalSection对象来控制链表,就可以达到这个目的。


在运行性能比较重要而且资源不会跨进程使用时,建议采用临界区代替信号灯。有关在MFC中使用信号灯的详细信息,请参阅CMutex。使用CCriticalSection对象之前,需要构造它。在构造函数返回后,就可以使用临界区了。在使用完之后要调用UnLock函数。存取由CCriticalSection控制的资源时,要在资源的存取函数中定义一个CSingleLock型的变量。然后调用加锁对象的Lock成员函数(如CSingleLock::Lock)。此时,调用的线程要么获得对资源的存取权,要么等待他人释放资源等待加锁,或者等待他人释放资源,但又因为超时而加锁失败。这样就保证了一次只有一个线程在存取临界资源。释放资源只需调用成员函数UnLock(例如CSingleLock::Unlock),或让锁对象在作用范围之外。此外,可以单独地建立一个CCriticalSection对象,并在存取临界资源之前存取它。这种方式有助于保持代码的清晰,但是更容易出错,因为程序员要记住在存取临界资源前加锁,存取之后开锁。
       关键段(critival section)是一小段代码,他在执行之前需要独占对一些共享资源的访问权。这种方式可以让多行代码以“原子方式”来对资源进行操控。这里的“原子方式”,指的是代码知道除了当前线程之外没有其他任何线程会同时访问该资源。当然,系统仍然可以暂停当前线程去调度其他线程。但是,在当前线程离开关键段之前,系统是不会去调度任何想要访问同一资源的其他线程的。
       例如:如果两个线程同时访问一个链表,一个线程可能会在另一个线程搜寻元素的同时向链表中添加一个元素,将导致搜索结果不正确;还有可能两个线程同时向链表中添加元素,这种情况会变的更加混乱;甚至一个线程搜索的时候,另一个线程删除了链表节点,将直接导致程序崩溃。解决这个问题,我们可以先在代码中定义一个CRITICAL_SECTION数据结构m_sect,然后把任何需要访问共享资源的代码放在EnterCriticalSection和LeaveCriticalSection之间。
       一个 CRITICAL_SECTION结构就像是飞机上的一个卫生间,而马桶则是我们想要保护的资源(用EnterCriticalSection和LeaveCriticalSection组成的围墙包围住“马桶”)。由于卫生间很小,因此在同一时刻只允许一个人在卫生间内使用马桶(在同一时刻只允许一个线程在关键段中使用被保护资源)。如果有多个总是应该在一起使用的资源,那么我们可以把他们放在同一个“卫生间”中:只需要创建一个CRITICAL_SECTION结构来保护所有这些资源。

网友评论文明上网理性发言,请遵守新闻评论服务协议
(查看全部 0 条评论)
 
验证码:  
网尚生活E尚综合

波斯湾进入印度洋的唯一出口就是霍尔木兹海峡。它是连接波斯湾和印度洋的海峡,北岸是伊朗,...[详细] 评论(0)  

     54的因数有1,2,3,6,9,18,27,54,质数有2,3,合数有6,9,18,27,54,在小学数学里,两个正整数相乘,那么这两个数都叫做积的因数,或称为约数。事实上因...[详细]

导读:编辑整理 2020-09-01阅读全文>>

  8月24日电 日前,在主题为“快递员 ALL力给”的德邦快递2020快递员大会上,德邦快递董事长崔维星亲手为207位“金星快递员”每人颁发了价值10万元的金砖,总价值共计2070万元...[详细]

导读:编辑整理 2020-08-26阅读全文>>
网罗推荐
电商国际
品牌乐享
电商经济
CopyRight @ 2005-2020 Reserved 亿尚网版权所有尊重原创禁止抄袭违者必究