C 執行緒使用

2022-03-02 10:58:37 字數 3241 閱讀 8731

1.lock鎖定

建立乙個類,程式碼如下:

view code

class person

runcountb: runcountc:

", runcounta, runcountb, runcountc);

break;}//

lock (o)

////}}

}public

void doworkb()

runcountb: runcountc:

", runcounta, runcountb, runcountc);

break;}//

lock (o)

////}}

}private

object o=new

object();

}

呼叫程式碼如下:

static

void main(string args)

在沒有使用lock物件的時候,得出的結果如下:

可以看出。runcounta!=runcount ,runcountc不等於runcounta+runcountb,這個就是對執行緒共享變數的問題。

下面加上lock鎖定,要鎖定,定義乙個objct變數

再次執行程式碼:

會得到我們期望的數值,介面如下:

2.使用mutex

定義:private mutex mutex = new mutex();

鎖定:mutex.waitone();從這裡開始的程式碼變數是安全的。

釋放:mutex.releasemutex();

把lock 去掉,用這2個語句代替。也能達到上面的效果。

3.monitor是乙個靜態類,提供靜態方法。

首先:定義乙個object 物件,必須是object物件,否則會出錯。

if (monitor.tryenter(o))

monitor.exit(o);

}

monitor.tryenter(o) 是否能進入這塊區域

monitor.enter(o);鎖定區域

monitor.exit(o);釋放區域

4.interlocked 提供原子鎖定,也是提供靜態方法

其中usingresource為int ,必須定義為private  int usingresource = 0,因為第一次是從0開始。要和開始方法中的變數不同。

如果interlocked.exchange(ref usingresource, 1)是1則private  int usingresource = 0,否則private  int usingresource = 1

if (0 == interlocked.exchange(ref usingresource, 1))進入鎖定區域

interlocked.exchange(ref usingresource, 0); 釋放鎖定區域

interlocked.increment(ref safeinstancecount);原子遞增,相當於 safeinstancecount++
interlocked.decrement(ref safeinstancecount);原子遞減,相當於 safeinstancecount--
5.waitcallback使用,允許執行緒通過發訊號互相通訊

如:此計算的格式為:result = first term + second term + third term,其中每項都要求使用計算出的基數進行預計算和最終計算

此類,需要呼叫threadpool這個進行護理。

5.1 定義幾個處理方法

autoresetevent autoevents

autoevents = new autoresetevent

;初始狀態為執行狀態。

5.2 定義manualresetevent manualevent;表示,是否能執行完這個執行緒,可以繼續執行下面的程式碼

初始化為: manualevent = new manualresetevent(false);

manualevent.reset();為執行緒結束,可以繼續下面的程式碼

5.3使用threadpool執行緒池來執行執行緒

threadpool.queueuserworkitem(

new waitcallback(calculatebase));

threadpool.queueuserworkitem(

new waitcallback(calculatefirstterm));

threadpool.queueuserworkitem(

new waitcallback(calculatesecondterm));

threadpool.queueuserworkitem(

new waitcallback(calculatethirdterm));

5.4對於每乙個方法 autoevents[0].set();表示第二個方法結束,可以釋放訊號。

manualevent.set();是第乙個方法結束,進入manualevent處理中。

最後在manualevent.reset();方法後,將得到的結果進行處理。

6.threadpool系統提供的執行緒池,託管執行緒池中的執行緒為後台執行緒,每個程序都有乙個執行緒池。執行緒池的預設大小為每個可用處理器有 25 個執行緒。

使用 setmaxthreads 方法可以更改執行緒池中的執行緒數。執行緒池中的執行緒,是自動執行的。

6.1threadpool.queueuserworkitem

將方法排入佇列以便執行。此方法在有執行緒池執行緒變得可用時執行。此方法,可以帶引數,可以傳遞給方法引數

threadpool.queueuserworkitem(

new waitcallback(calculatebase),"12");

7. lockcookie 單個編寫器/多個閱讀器語義的鎖

7.1 readerwriterlock rwl = new readerwriterlock();定義鎖

7.2 rwl.acquirereaderlock(timeout);讀取鎖開始

rwl.releasereaderlock();釋放讀取鎖。

7.3 lockcookie lc = rwl.upgradetowriterlock(timeout);定義寫鎖

rwl.downgradefromwriterlock(ref lc);釋放寫鎖。

C 執行緒使用

執行緒建立的關鍵是要給它指定一段執行緒要執行的 段,這段 可以是任意可以訪問到的函式,如其它類的靜態函式,自己類定義的函式.1.先生成乙個threadstart 類的例項,將要執行緒執行的 和這個物件關聯,2.再在建立執行緒時的建構函式裡,用threadstart 類的例項實現關聯,下面的示例說明建...

c 執行緒使用

一直習慣用c語言的方法建立執行緒,即pthread create和 beginthread,但總覺得這樣不夠物件導向。c 建立執行緒有兩種方法 基於物件的方法和物件導向的方法。物件導向建立執行緒相比較面向過程的優點是可以復用一些公共函式,像執行緒的開始,執行緒的結束,執行緒的暫停等等。基於物件建立執...

c 中使用多執行緒

using system using system.drawing using system.collections using system.componentmodel using system.windows.forms using system.data using system.threa...