C 任務同步

2022-04-04 00:29:45 字數 2878 閱讀 1743

using

system;

using

system.diagnostics;

using

system.threading;

using

system.threading.tasks;

using

static

system.console;

//任務同步

鎖定乙個引用型別的變數

/*死鎖

lock (_s1)

} lock (_s2)

} *///

2.interlocked類,更快但只支援少數幾種的操作

//public int state

////}//

}//相當於//

public int state

////}//

3.monitor類

結構,傳遞時需加引用,不然結構會以值傳遞

//如果有大量鎖定,如列表的每乙個節點都有乙個鎖定,且鎖定時間非常短,spinlock結構就很有用

//它與monitor類似,enter tryenter exit

抽象基類 用於等待乙個訊號(waitone() waitall() ...)

類 作業系統能識別有名稱的互斥,可以跨執行緒,如果沒有指定名稱則不在不同的程序之間共享

類 非常類似於互斥,區別是它可以同時由多個執行緒使用,是一種計數的互斥

類 事件與互斥和訊號量一樣,也是乙個系統範圍內的資源同步方法

//manualresetevent autoresetevent manualreseteventslim countdownevent

類 readerwriterlockslim類

類//threading中的timer 基於xaml應用程式的dispatchertimer

namespace

loops");

}_state = 5

; }}}

class

program

//lock由編譯器解析為monitor類

monitor.enter(o);

try

finally

//monitor可以設定等待時間

bool _locktaken = false

; monitor.tryenter(o,

500, ref

_locktaken);

if (_locktaken)//

get the lock

finally

}else

//互斥

bool

createnew;

//第3個為輸出引數,接收乙個表示互斥是否為新建的布林值,

//如果(createnew)返回為false就表示互斥已經定義

var mutex = new mutex(false, "

procsharpmutex

", out

createnew);

if(mutex.waitone())

finally

}else

//訊號量

int taskcount = 6

;

int semaphorecount = 3

;

var semaphore = new semaphore(semaphorecount-1, semaphorecount);//

初始請求數 最大請求數

try"

); }

catch

(exception)

var tasks = new

task[taskcount];

for (int i = 0; i < taskcount; ++i)

task.waitall(tasks);

writeline(

"all tasks finished");

//事件

autoresetevent autoevent = new autoresetevent(false

); autoevent.reset();

autoevent.set();

autoevent.waitone();

//timer

using (var timer1 = new timer(timeaction, null, 0

/*timespan.fromseconds(0)

*/, 1000

/*timespan.fromseconds(3)

*/))

readkey();

}public

static

void

racecondition()

}});}}

public

static

void

taskmain(semaphore semaphore)

locks the semaphore");

task.delay(

200).wait();

}finally

release the semaphore");

semaphore.release();

//釋放 計數+1

iscomplete = true

; }

}else

; wait again");}}

}private

static

void timeaction(object

o) ");}}

}

C 多執行緒任務同步

首先建立全域性變數 int count 0 object monitorobject new object 建立兩個任務 public void task01 public void task02 控制台程式啟動多執行緒,並列印count的值 task t1 task.run task01 task...

多工 同步

實現多工之間通訊的最簡便的辦法是使用共享的資料結構。雖然共享資料區簡化了任務間的通訊,但是必須保證 每個任務在處理共享資料時的排他性。以避免競爭和資料破壞。共享資源滿足互斥性的一般方法有 1.關中斷,開中斷 2.使用測試並置位指令 3.禁止做任務切換 4.利用訊號量 一.關中斷 開中斷 這估計是最簡...

任務同步四

semaphore類 訊號量非常類似於互斥,其區別是,訊號量可以同時由多個執行緒使用。訊號量是一種計數的互斥鎖定。使用訊號量可以定義允許同時訪問受旗語鎖定保護的資源的執行緒個數。如果需要限制可以訪問可用資源的執行緒數,訊號量就很有用。static void main string args task...