线程同步之临界区

  临界区:当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。
临界区线程同步适用范围:它只能同步一个进程中的线程,不能跨进程同步。一般用它来做单个进程内的代码快同步,效率比较高。

在.Net中有Monitor、Lock等方式是以临界区的方式来实现线程同步的,我们看一下两者的具体示例。

1、Lock  Lock关键字将代码块标记为临界区,方法是获取指定对象的互斥锁,执行语句,然后释放锁,这样其它线程就可以接着获取锁来进入临界区。

Lock关键字保证了临界资源在同一时刻只能有唯一一个线程访问,一旦有线程获取互斥锁,进入临界区,其它线程访问时就会被挂起,直到当前线程释放锁。

private static object lockObj = new object();
lock(lockObj)
{
    //操作公共资源
}

对于任何一个引用对象都存在一个索引,该索引指向CLR中SyncBlock Cache中的SyncBlock。当执行lock(object)时,如果object索引值为负数,就从SyncBlock Cache

中取出一个SyncBlock,存入object索引值,这样object索引值就变成了正数。当有其它线程再进入时lock(object)时发现object索引值不为负,责挂起等待,直到object索引

值变为负数。

使用lock应注意

1)lock不能锁定null值

2)lock不能锁定string类型的值,虽然它是引用类型,旦字符串类型被CLR暂留

3)lock锁定的必须是引用类型,不能是值类型

4)lock避免锁定public对象,因为公开的对象可能被其它类进行修改,很可能导致死锁。如lock(this)时,当前对象的公开属性值被修改后,会造成线程安全问题

2、Monitor的用法

  Monitor类使用Enter(object)和Exit(object)来标示临界区,事实上lock使用的原理就是Monitor。当lock开始是调用就是monitor.Enter(object),当lock结束时

则调用monitor.Exit(object)释放object锁。

时间: 2024-10-26 17:56:14

线程同步之临界区的相关文章

win32多线程 (二)线程同步之临界区 (critical sections)

所谓critical sections 意指一小块“用来处理一份被共享之资源”的程序代码.你可能必须在程序的许多地方处理这一块可共享的资源.所有这些程序代码可以被同一个critical  section 保护起来.为了阻止问题发生,一次只能有一个线程获准进入critical  section 中.critical section 并不是核心对象.使用方法: CRITICAL_SECTION g_section; 1:初始化 InitializeCriticalSection(&g_section

VC++线程同步(三) 临界区使用例子

临界区(Crtical Section)同步对象 用户模式下的同步对象 Win32中,最容易使用的一个同步机制就是(关键段)Critical Section, 某些共享资源具有互斥性,也就是它要求被互斥地使用,他也是用于资源的互斥, 在大部分情况下,使用临界区替换Mutex(Mutex是内核模式下的同步对象). 局限性:他只能用于同步单个进程中的线程. 在任何同步机制当中,无论是哪个操作系统下,都不要 长时间的锁住资源,如果一直锁定资源,就会一致阻止其他线程的执行, 使整个程序,处于完全停止的状

线程同步(临界区的使用)

1.SingalObject #include <windows.h>#include <iostream> using namespace std; CRITICAL_SECTION cs; int m = 0;int n = 0;DWORD WINAPI ThreadProc(LPVOID Param);int main(){ InitializeCriticalSection(&cs); int a = 10; HANDLE ThreadHandle = Create

临界区,互斥量,信号量,事件的区别(线程同步)

(转)临界区,互斥量,信号量,事件的区别(线程同步) (转)临界区,互斥量,信号量,事件的区别(线程同步) . 分类: C++ windows 核心编程 2012-04-10 14:55 3321人阅读 评论(0) 收藏 举报 semaphoremfcnulleventsthreadhttp服务器 四种进程或线程同步互斥的控制方法 1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问. 2.互斥量:为协调共同对一个共享资源的单独访问而设计的. 3.信号量:为控制一个

C++实现线程同步的几种方式

线程同步是指同一进程中的多个线程互相协调工作从而达到一致性.之所以需要线程同步,是因为多个线程同时对一个数据对象进行修改操作时,可能会对数据造成破坏,下面是多个线程同时修改同一数据造成破坏的例子: 1 #include <thread> 2 #include <iostream> 3 4 void Fun_1(unsigned int &counter); 5 void Fun_2(unsigned int &counter); 6 7 int main() 8 {

进程通信、线程同步 概述

进程通信.线程同步  概述 线程同步 CRITICAL_SECTION 临界区. 同一时刻只能由一个线程访问的资源,叫临界资源,比如打印机.访问临界资源的代码叫临界代码区域. CRITICAL_SECTION对象没有句柄,不能被其他线程共享. 线程同步之 CRITICAL_SECTION . http://blog.csdn.net/chuchus/article/details/24494253 MUTEX 互斥量. MUTEX对象有句柄,所以也可用于不同进程的线程之间做同步. MUTEX有超

Delphi 线程同步技术(转)

上次跟大家分享了线程的标准代码,其实在线程的使用中最重要的是线程的同步问题,如果你在使用线程后,发现你的界面经常被卡死,或者无法显示出来,显示混乱,你的使用的变量值老是不按预想的变化,结果往往出乎意料,那么你很有可能是忽略了线程同步的问题. 当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源.例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件中的字符数.当然,在把整个文件调入内存之前,统计它的计数是没有意义的.但是,由于每个操作都有自己的 线程,操作系统

线程同步方式之互斥量Mutex

互斥量和临界区非常相似,只有拥有了互斥对象的线程才可以访问共享资源,而互斥对象只有一个,因此可以保证同一时刻有且仅有一个线程可以访问共享资源,达到线程同步的目的. 互斥量相对于临界区更为高级,可以对互斥量进行命名,支持跨进程的线程同步.互斥量是调用的Win32的API对互斥锁的操作,因此在同一操作系统下不同进程可以按照互斥锁的名称共享锁. 正因为如此,互斥锁的操作会更好资源,性能上相对于临界区也有降低,在使用时还要多斟酌.对于进程内的线程同步使用临界区性能会更佳. 在.Net中使用Mutex类来

delphi线程同步

本文完全摘自网络,仅供自己查询 上次跟大家分享了线程的标准代码,其实在线程的使用中最重要的是线程的同步问题,如果你在使用线程后,发现你的界面经常被卡死,或者无法显示出来,显示混乱,你的使用的变量值老是不按预想的变化,结果往往出乎意料,那么你很有可能是忽略了线程同步的问题. 当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源.例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件中的字符数.当然,在把整个文件调入内存之前,统计它的计数是没有意义的.但是,由于每