C#线程同步(2)- 临界区&Monitor】的更多相关文章

在多线程代码中,多个线程可能会访问一些公共的资源(变量.方法逻辑等等),这些公共资源称为临界区(共享区):临界区的资源是不安全,所以需要通过线程同步对多个访问临界区的线程进行控制. 同样,有些时候我们需要多个线程按照特定的顺序执行,这时候,我们也需要进行线程同步. 下面,我们就看看C#中通过lock和Monitor进行线程同步. lock关键字 lock是一种非常简单而且经常使用的线程同步方式,lock 关键字将语句块标记为临界区. lock 确保当一个线程位于代码的临界区时,另一个线程不能进入…
当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源. 例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件的字符数.当然,在整个文件调入内存之前,统计它的计数是没有意义的.但是,由于每个操作都有自己的线程,操作系统会把两个线程当做是互不相干的任务分别执行,这样就可能在没有把整个文件装入内存时统计字数.为解决此问题,你必须使两个线程同步工作 存在一些线程同步地址的问题,Win 32 提供了许多线程同步的方式.这里将会讲到:临界区.互斥.信号量和事件 为了检验…
当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源. 例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件的字符数.当然,在整个文件调入内存之前,统计它的计数是没有意义的.但是,由于每个操作都有自己的线程,操作系统会把两个线程当做是互不相干的任务分别执行,这样就可能在没有把整个文件装入内存时统计字数.为解决此问题,你必须使两个线程同步工作 存在一些线程同步地址的问题,Win 32 提供了许多线程同步的方式.这里将会讲到:临界区.互斥.信号量和事件 为了检验…
在上一讲介绍了使用lock来实现C#线程同步.实际上,这个lock是C#的一个障眼法,在C#编译器编译lock语句时,将其编译成了调用Monitor类.先看看下面的C#源代码: public static void MyLock()  {  lock (typeof(Program))  {  }  } 上面的代码通过lock语句使MyLock同步,这个方法被编译成IL后,代码如图1所示. 图1 从上图被标注的区域可以看到,一条lock语句被编译成了调用Monitor的Enter和Exit方法.…
一.Monitor类说明,提供同步访问对象的机制. 1.位于System.Threading命名空间下,mscorlib.dll程序集中. 2.Monitor通过获取和释放排它锁的方式实现多线程的同步问题. 3.Monitor实现当前进程内的多线程的同步,和lock语句的功能类似. 4.当前为静态类,使用简单 5.依赖的锁定对象和lock语句中类似,同样需要引用类型.建议私有.只读.静态 定义代码: // // 摘要: // 提供同步访问对象的机制. [ComVisible(true)] pub…
多核/多线程编程中肯定会用到同步互斥操作.除了互斥变量以为,就是临界区. 临界区是指在用一时刻只允许一个线程执行的一段用{...},包围的代码段. 在OpenMP中临界区声明方法如下: #pragma omp critical [(name)] //[]表示名字可选 { //需要同一时刻只能有一个线程访问的代码 } 如下面的代码: #include <stdio.h> #include <omp.h> int main() { ; #pragma omp parallel prin…
#include <iostream> #include <windows.h> using namespace std; CRITICAL_SECTION cs; // LockCount 它被初始化为数值 -1,此数值等于或大于 0 时,表示此临界区被占用;等待获得临界区的线程数:LockCount - (RecursionCount -1) // RecursionCount 此字段包含所有者线程已经获得该临界区的次数 // OwningThread 此字段包含当前占用此临界…
1.相关文件和接口 #include <windows.h> CRITICAL_SECTION cs;//定义临界区对象 InitializeCriticalSection(&cs);//初始化临界区 EnterCriticalSection(&cs);//进入临界区 LeaveCriticalSection(&cs);//离开临界区 DeleteCriticalSection(&cs);//删除临界区 2.测试代码 #include <Windows.h…
所谓critical sections 意指一小块“用来处理一份被共享之资源”的程序代码.你可能必须在程序的许多地方处理这一块可共享的资源.所有这些程序代码可以被同一个critical  section 保护起来.为了阻止问题发生,一次只能有一个线程获准进入critical  section 中.critical section 并不是核心对象.使用方法: CRITICAL_SECTION g_section; 1:初始化 InitializeCriticalSection(&g_section…
原文地址:http://www.cnblogs.com/lxblog/archive/2013/03/07/2947182.html 今天我们总结一下 C#线程同步 中的 Monitor 类 和 Lock 关键字进行一下总结. 首先来看看他们有什么异同(相信对此熟悉的朋友们都很清楚): 1.他们都是在指定对象上获取排他锁,用于同步代码区2.Lock关键字是Monitor的一种替换用法,lock在IL代码中会被翻译成Monitor. lock(obj){//代码段} 就等同于 Monitor.En…