1. 程式人生 > >C#多執行緒學習(六) 互斥物件

C#多執行緒學習(六) 互斥物件

如何控制好多個執行緒相互之間的聯絡,不產生衝突和重複,這需要用到互斥物件,即:System.Threading 名稱空間中的 Mutex 類。

我們可以把Mutex看作一個計程車,乘客看作執行緒。乘客首先等車,然後上車,最後下車。當一個乘客在車上時,其他乘客就只有等他下車以後才可以上車。而執行緒與Mutex物件的關係也正是如此,執行緒使用Mutex.WaitOne()方法等待Mutex物件被釋放,如果它等待的Mutex物件被釋放了,它就自動擁有這個物件,直到它呼叫Mutex.ReleaseMutex()方法釋放這個物件,而在此期間,其他想要獲取這個Mutex物件的執行緒都只有等待。

下面這個例子使用了Mutex物件來同步四個執行緒,主執行緒等待四個執行緒的結束,而這四個執行緒的執行又是與兩個Mutex物件相關聯的。

其中還用到AutoResetEvent類的物件,可以把它理解為一個訊號燈。這裡用它的有訊號狀態來表示一個執行緒的結束。

// AutoResetEvent.Set()方法設定它為有訊號狀態

// AutoResetEvent.Reset()方法設定它為無訊號狀態

Mutex 類的程式示例:

Code

程式的輸出結果:

結果

從執行結果可以很清楚地看到,執行緒t2,t3的執行是以gM1的釋放為條件的,而t4在gM2釋放後開始執行,t1則在gM1和gM2都被釋放了之後才執行。Main()函式最後,使用WaitHandle等待所有的AutoResetEvent物件的訊號,這些物件的訊號代表相應執行緒的結束。

相關推薦

C#執行學習() 互斥物件

如何控制好多個執行緒相互之間的聯絡,不產生衝突和重複,這需要用到互斥物件,即:System.Threading 名稱空間中的 Mutex 類。 我們可以把Mutex看作一個計程車,乘客看作執行緒。乘客首先等車,然後上車,最後下車。當一個乘客在車上時,其他乘客就只有等他下

C# 執行學習系列二

一、關於前臺執行緒和後臺執行緒 1、簡介 CLR中執行緒分為兩種型別,一種是前臺執行緒、另一種是後臺執行緒. 前臺執行緒:應用程式的主執行緒、Thread構造的執行緒都預設為前臺執行緒 後臺執行緒:執行緒池執行緒都為後臺執行緒   2、區別 前臺執行緒:前臺執行緒一般執行重要性很高的任

C# 執行學習系列四之取消、超時子執行操作

1、簡介 雖然ThreadPool、Thread能開啟子執行緒將一些任務交給子執行緒去承擔,但是很多時候,因為某種原因,比如子執行緒發生異常、或者子執行緒的業務邏輯不符合我們的預期,那麼這個時候我們必須關閉它,而不是讓它繼續執行,消耗資源.讓CPU不在把時間和資源花在沒有意義的程式碼上.  

執行學習——ThreadLocal的使用

package day1; import java.util.HashMap; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; im

執行學習:Future與FutureTask

FutureTask是Future介面的一個唯一實現類,可以作為Runnable被執行緒執行,也可以作為Future得到Callable的返回值。 Future就是對於具體的Runnable或者Callable任務的執行結果進行取消、查詢是否完成、獲取結果。必要

【Linux C 執行程式設計】互斥鎖與條件變數

一、互斥鎖互斥量從本質上說就是一把鎖, 提供對共享資源的保護訪問。  1. 初始化:  在Linux下, 執行緒的互斥量資料型別是pthread_mutex_t. 在使用前, 要對它進行初始化:  對於靜態分配的互斥量, 可以把它設定為PTHREAD_MUTEX_INITIA

C++ 執行併發控制——互斥鎖 pthread_mutex

問題描述:有兩個執行緒,主執行緒負責接收資料,並暫時儲存在記憶體中,當記憶體中數量達到一定資料量時,批量提交到oracle中;另一個執行緒作為提交執行緒,定時檢查一遍,不論記憶體中資料量達到多少,定期將資料提交到oracle中。兩個執行緒併發進行,第一個寫入記憶體或者資料庫

【VS2010】C++執行同步與互斥簡單運用

繼以往的想法,寫這點文字,貼上點程式碼,是為了增加自己的記憶,也希望能幫助到需要幫助的人。 1.  互斥量,Mutex #include <Windows.h> #include <iostream> usingnamespace

C# 執行學習(五)執行同步和衝突解決

首先先說一個執行緒不同步的例子吧,以下為售票員的模擬售票,多個售票員出售100張門票,程式碼如下: using System; using System.Text; using System.Collections.Generic; using Syste

C#執行學習(九)lock,Monitor,Mutex的區別

lock和Monitor的區別 一、lock的底層本身是Monitor來實現的,所以Monitor可以實現lock的所有功能。 二、Monitor有TryEnter的功能,可以防止出現死鎖的問題,lock沒有。 Mutex和其他兩者的區別 個人測試三個都是在限制執行緒

C#執行學習(五) 執行的自動管理(定時器)

Timer類:設定一個定時器,定時執行使用者指定的函式。 定時器啟動後,系統將自動建立一個新的執行緒,執行使用者指定的函式。 初始化一個Timer物件: Timer timer = new Timer(timerDelegate, s,1000, 1000); /

C#執行學習(四) 執行的自動管理(執行池)

在多執行緒的程式中,經常會出現兩種情況: 一種情況: 應用程式中,執行緒把大部分的時間花費在等待狀態,等待某個事件發生,然後才能給予響應 這一般使用ThreadPool(執行緒池)來解決; 另一種情況:執行緒平時都處於休眠狀態,只是週期性地被喚醒 這一般使用Tim

Linux C/C++執行學習:生產者消費者問題

#include <iostream> #include <mutex> #include <condition_variable> #include <unistd.h> #include <thread> using namespace std;

[C#] C#執行學習(四) 執行的自動管理(執行池)

Thread Pool Sample: Queuing  10  items to Thread Pool Queue to Thread Pool  0 Queue to Thread Pool  1 Queue to Thread Pool  2 Queue to Thread Pool  3 Q

執行學習-----ThreadLocal使用()

一.對ThreadLocal的理解 ThreadLocal,很多地方叫做執行緒本地變數,也有些地方叫做執行緒本地儲存,其實意思差不多。可能很多朋友都知道ThreadLocal為變數在每個執行緒中都建立了一個副本,那麼每個執行緒可以訪問自己內部的副本變數。這句話從字面上看起來很容易理解,但是真正理

Java執行學習筆記() synchronized(this)同步語句塊

synchronized (this)同步語句塊 1. 一半非同步,一半同步 1.1 Task 1.2 ThreadA 1.3 ThreadB 1.4 Test 1.5 執行結果 2. synchronize

C++ 執行pthread 學習筆記

本篇是我在學習C++多執行緒的時候做的筆記,主要記錄的是基礎的流程,部分程式碼例項,以及重點函式的說明。 pthread 入口函式型別說明 void * func1(void * t) void* 表示無型別指標 void*作為函式引數,表示函式接收一個指標,不管是什麼型別

C# 執行之Task(任務)二

前面介紹了Task的由來,以及簡單的使用,包括開啟任務,處理任務的超時、異常、取消、以及如果獲取任務的返回值,在回去返回值之後,立即喚起新的執行緒處理返回值、且如果前面的任務發生異常,喚起任務如果有效的處理異常等關於Task的知識。所以本文將介紹Task更多的用法和特性.   一、如果通過一個任

執行學習筆記--02(物件及變數的併發訪問)

  1.學習目標          Synchronized物件監視器為Object時的使用      Synchronized物件監視器為Class時的使用    

C# 執行之Task(任務)三之任務工廠 C# 執行之Task(任務)二

1、知識回顧,簡要概述 前面兩篇關於Task的隨筆,C# 多執行緒五之Task(任務)一 和 C# 多執行緒六之Task(任務)二,介紹了關於Task的一些基本的用法,以及一些使用的要點,如果都看懂了,本文將介紹另一個Task的特殊用法,前面介紹了,如何通過一個父任務建立多個子任務,且這