C#互斥体——Mutex

Mutex对象是一个同步基元,可以用来做线程间的同步。

若多个线程需要共享一个资源,可以在这些线程中使用Mutex同步基元。当某一个线程占用Mutex对象时,其他也需要占用Mutex的线程将处于挂起状态。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace myTest
{
    class Program
    {
        static List<string> enterList = new List<string>();//用来记录结果
        static Mutex mt = new Mutex();//创建一个同步基元
        static int threadNum = 3, round = 3; //开启3个线程,每个线程测试3轮
        //阶段控制对象,每一轮完成后打印结果
        static Barrier br = new Barrier(threadNum, (b) =>
           {
               Console.WriteLine(String.Format("第{0}轮测试完成,线程获取互斥体情况如下:",(b.CurrentPhaseNumber+1)));
               foreach (string enter in enterList)
               {
                   Console.WriteLine(enter);
               }
               enterList.Clear();
               if (b.CurrentPhaseNumber == round-1)
               {
                   Console.WriteLine("所有测试完成!");
                   Console.ReadLine();
               }
           }); 

        static void Main(string[] args)
        {
           int i;
           Thread t;
           for (i = 0; i < threadNum; i++)
           {
               t = new Thread(startTest);
               t.Name = "t" + (i+1);
               t.Start();
           }
        }
        static void startTest(){
            int i;
            for (i = 0; i < round; i++)
            {
                testMutex();
            }
        }
        static void testMutex()
        {
            mt.WaitOne();
            enterList.Add(String.Format("{0}-线程{1}获取互斥体", DateTime.Now.ToString(), Thread.CurrentThread.Name));
            Thread.Sleep(1000);
            enterList.Add(String.Format("{0}-线程{1}释放互斥体", DateTime.Now.ToString(), Thread.CurrentThread.Name));
            mt.ReleaseMutex();
            br.SignalAndWait();
        }

    }
}

时间: 2024-11-09 07:06:58

C#互斥体——Mutex的相关文章

linux驱动之 信号量 自旋锁 互斥体

原子操作 原子操作就是单位操作,也就是说操作过程不能被中断 下面代码中每条语句看起来是原子操作,其实不是原子操作: int main(0 { int i=2;//两天汇编语句组成 i=i+3;//三条汇编语句组成 } 实现原子操作方法; 1  自旋锁 自旋锁它是为为实现保护共享资源而提出一种锁机制.其实,自旋锁与互斥锁比较类似 ,它们都是为了解决对某项资源的互斥使用.无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁.但是两者在调度机制上略

信号量、互斥体和自旋锁

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/21/2602015.html 信号量.互斥体和自旋锁 一.信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信.本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况.一般说来,为了获得共享资源,进程需要执行下列操作:  (1) 测试控制该资源的信号量.  (2) 若此信号量的值为正,则允许进行使用该资源.进程将信号量减1.

互斥体与互锁 &lt;第五篇&gt;

互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex)).互斥体禁止多个线程同时进入受保护的代码“临界区”.因此,在任意时刻,只有一个线程被允许进入这样的代码保护区. 任何线程在进入临界区之前,必须获取(acquire)与此区域相关联的互斥体的所有权.如果已有另一线程拥有了临界区的互斥体,其他线程就不能再进入其中.这些线程必须等待,直到当前的属主线程释放(release)该互斥体.什么时候需要使用互斥体呢?互斥体用于保护共享的易变代码,也就是,全

信号量、互斥体和自旋锁小结

概述 linuxn内核同步机制几种常用的方式,面试经常会被问道,这里做一个小结 [1]信号量 [2]互斥体 [3]自旋锁 [4]区别 1.信号量(semaphore) 又称为信号灯,本质上,信号量是一个计数器,用来记录对某个共享资源的存取情况,一般共享资源通过以下步骤 (1) 测试控制该资源的信号量(n). (2) 若此信号量的值为正,则允许进行使用该资源.进程将信号量减1. (3) 若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1). (4)

[转载] 《重要》内核下各种同步处理方法(自旋锁、信号灯、互斥体…)

本文转载自: http://www.blogfshare.com/kernel-synchronization.html 1.在支持多线程的操作系统下,有些函数会出现不可重入的现象.所谓“可重入”是指函数的执行结果不和执行顺序有关.反之如果执行结果和执行顺序有关,则称这个函数是“不可重入”的. 2.Windows将中断的概念进行了扩展,提出一个中断请求级(IRQL)的概念.其中规定了32个中断请求级别,分别是0~2级别为软件中断,3~31级为硬件中断,其中数字从0~31,优先级别逐次递增. 在内

linux C 互斥量mutex 使用记录

一.互斥量 Mutex 主要包含一下几个函数: 1.int pthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); 初始化一个mutex,如果attr为NULL测按默认值初始化,另外还可以在定义互斥量的时候按照下面的方式初始化一个互斥量: pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 一个被lock的信号量,可以直接被恢复到初始态而不产生错误

windows多线程(六) 互斥量Mutex与关键段CriticalSection比较

一.关键段CS 和 互斥量Mutex 的相同点:都有线程拥有权 关键段和互斥量都有线程拥有权,即可以被一个线程拥有.在 前面讲关键段CS的文章中有说到,关键段结构体的第四个参数保存着拥有该关键段的线程的句柄,具体如下: typedef struct _RTL_CRITICAL_SECTION { PRTL_CRITICAL_SECTION_DEBUG DebugInfo; // // The following three fields control entering and exiting

C#线程同步(3)- 互斥量 Mutex

什么是Mutex "mutex"是术语"互相排斥(mutually exclusive)"的简写形式,也就是互斥量.互斥量跟临界区中提到的Monitor很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问.当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源.互斥量比临界区复杂,因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以

C++多线程同步技巧(三)--- 互斥体

简介 Windows互斥对象机制. 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问,在线程同步与保证程序单体运行上都有相当大的用处. 代码样例 //////////////////////////////// // // FileName : MutexDemo.cpp // Creator : PeterZheng // Date : 2018/10/23 21:27 // Comment : The usage of "Creat