同步構造 上篇

2021-07-04 20:27:12 字數 3550 閱讀 8105

這些內容說實話,

我自己還不是很明白

,但是我腦海裡初戀了兩個小人

,第乙個小人說

,別老是停留在自己會的那個階段

,有時候稍微搞搞你不明白的東西對你來說是一種進步

,第二個小人說

:」第乙個小人說得對啊」

mutex就像乙個

c#lock一樣,

不同的是它可以跨程序

.

進入和釋放乙個mutex

要花費幾毫秒

,大約比c#的

lock慢50

倍.

使用乙個mutex

的實力,

呼叫waitone

方法來獲取鎖

,releasemutex

方法來釋放鎖

.

因為mutex

是跨程序的

,所以我們可以使用

mutex

來測試程式是否已經執行

.

public static void mainthread()

runprogram();}}

乙個semaphore就像乙個酒吧一樣

,通過門衛來限制它的客人

,一旦達到限制

,沒有人可以進入

.

人們會乖乖的排隊,

一旦有乙個人離開了酒吧

,排隊中的人就可以進入乙個人了

. 案例:

class theclub

}static void enter(object id)

}

你如果有心的話,

我不用貼完整**

,你也會自己慢慢地一步一步的把這個案例測試完

.我說話挺狠啊

,我朋友都說我臉上這麼多痘痘就是因為我嘴太毒了

...乙個autoresetevent

就像十字轉門一樣

,插入一張票就讓乙個人通過

,」auto」代表門會自動關上.

在十字門外的人可以呼叫waitone

方法來阻塞,等待

.一旦有人插入了票(呼叫

set方法

),就可以讓外面等待的人(呼叫

waitone)

通過了.

建立autoresetevent

有乙個引數.

static eventwaithandle _waithandle = new autoresetevent(false);

其中false

在msdn

裡的解釋為

:初始狀態為非終止.

其實這個false

代表了十字轉門沒有壞

,可以進人

,讓人等待.

而如果是true的話,

初始狀態為終止

,也就是代表已經呼叫

set了

,就是說十字轉門壞了

,所以接下來如果有人呼叫了

waitone方法,

這個呼叫

waitone

方法的人直接可以進入了

,不需要再插入票

(不需要再呼叫

set)了,

之後的呼叫和

false一致,

這一點可以認為

autoresetevent

具有記憶功能

,他記住了上次門是開啟的狀態

.所以呼叫

waitone

方法可以進入.案例

:

class threadautoresetevent

static void waiter()

}

分析:很簡單啊

,waiter

執行到waiting...後,

就開始呼叫

waitone了,

所以在門外排隊等待.

而主線程在睡了兩秒後,

開始插入了一張票,所以

waiter

就繼續執行了

,所以列印

notified. **如下:

接下來我們使用autoresetevent

來模擬實現生產消費問題:

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading;

using system.threading.tasks;

namespace mutex的案例

}console.read();}}

class producerconsumerqueue : idisposable

public void enqueuetask(string task)

_wh.set();//一旦有任務了,喚醒等待的執行緒.

}public void dispose()

void work()

}if (task!=null)//如果有任務的話,執行任務

else//否則阻塞}}}}}

說實話,

這段**我並不是很理解

,可以說不懂

,如果一偶高手能給我指點一二

,在下感激不盡

!乙個manuresetevent

就是乙個普通門,呼叫

set方法門就開了

,允許任何人進入,呼叫

waitone

方法就開始等待進入.呼叫

reset

方法就關門了

.在乙個關閉的門上呼叫

wasitone

方法就會被阻塞

.當門下次被開啟的時候

,所有等待的執行緒都可以進入了

.除了這些不同以外,乙個

manualresetevent

和autoresetevent

類似.

在.net 4

中,manualresetevent

提供了乙個優化版本

.manualreseteventslim.

優化版本有哪些好處不用我說了吧?

小小的結一下

本次內容主要講解了一點同步構造的內容,

說實話,

我看起來已經很吃力了

,但是沒辦法

,誰讓咱頭皮硬呢

,當然其他地方也硬!

深入淺出多執行緒系列之五 一些同步構造 上篇

1 mutex mutex 就像乙個 c lock 一樣,不同的是它可以跨程序.進入和釋放乙個 mutex 要花費幾毫秒,大約比c 的 lock慢50 倍。使用乙個 mutex 的例項,呼叫 waitone 方法來獲取鎖,releasemutex 方法來釋放鎖。因為mutex是跨程序的,所以我們可以...

深入淺出多執行緒系列之五 一些同步構造 上篇

1 mutex mutex 就像乙個 c lock 一樣,不同的是它可以跨程序.進入和釋放乙個 mutex 要花費幾毫秒,大約比c 的 lock慢50 倍。使用乙個 mutex 的例項,呼叫 waitone 方法來獲取鎖,releasemutex 方法來釋放鎖。因為mutex是跨程序的,所以我們可以...

物件的構造 上

類是一種特殊的自定義型別,自定義型別遵守c語言中所有資料型別的操作,也可以用來定義指標,這種特殊的自定義類可以用來定義變數,從物件導向的角度就是例項化乙個物件了,從程式的本質上來將就是定義乙個自定義型別的變數,既然是變數它就需要占用儲存空間,占用什麼區域的儲存空間和c語言中的說法一致,即區域性變數在...