C 並行程式設計 之 互斥鎖的使用

2021-07-02 14:25:55 字數 2744 閱讀 6604

在並行程式設計中,訪問臨界區是經常會遇到的問題,加鎖,釋放鎖是經常會使用到的解決方式。

例如:

lock(_oneobject)

lock會呼叫system.threading.monitor.enter方法,然後通過 system.threading.monitor.exit來進行釋放。

上面的**等同與

bool locktoken = false;

tryfinally

比較來看使用lock **簡潔,而且不用擔心monito.exit()的釋放問題,但monitor提供了更為豐富的鎖控制介面。可以依據實際情況進行選擇使用。

**示例:

using system;

using system.text;

using system.threading;

using system.threading.tasks;

namespace sample5_2_monitor_lock

task : # value: *****\n",

datetime.now.timeofday, taskid, i);

i++;

tryfinally }}

private

static

void

work2(int taskid)

task : # value: *****\n",

datetime.now.timeofday, taskid, i);

i++;

tryfinally}}

private

static

void

work3(int taskid)

task : # value: ~~~~~\n",

datetime.now.timeofday, taskid, i);

i++;

tryfinally}}

static

void main(string args)

, 0);

_tasks[1] = task.factory.startnew((num) =>

, 1);

_tasks[2] = task.factory.startnew((num) =>

, 2);

var finaltask = task.factory.continuewhenall(_tasks, (tasks) =>

);try

catch (aggregateexception aex)

finally

console.readline();}}

}

測試結果當然是按照我們預想的,非常完美,這裡就忽略了。

但可以看看如果沒有鎖的測試結果,雖然每個執行緒中迴圈才50次,就已經出現亂碼了。

其中主要使用的是 monitor.tryenter(),函式,其中多了乙個設定超時時間的引數。

**中讓每個鎖的超時timer為2秒,在work1中挺頓5秒,這樣造成了work2和work3的超時。

**示例:

using system;

using system.text;

using system.threading;

using system.threading.tasks;

namespace sample5_3_monitor_lock_timeout

task : # value: *****\n",

datetime.now.timeofday, taskid, i);

i++;

trysystem.threading.thread.sleep(5000);

}finally}}

private

static

void

work2(int taskid)

task : # value: *****\n",

datetime.now.timeofday, taskid, i);

i++;

try}

finally}}

private

static

void

work3(int taskid)

task : # value: ~~~~~\n",

datetime.now.timeofday, taskid, i);

i++;

try}

finally}}

static

void main(string args)

, 0);

_tasks[1] = task.factory.startnew((num) =>

, 1);

_tasks[2] = task.factory.startnew((num) =>

, 2);

var finaltask = task.factory.continuewhenall(_tasks, (tasks) =>

);try

catch (aggregateexception aex)

finally

console.readline();}}

}

linux多執行緒程式設計之互斥鎖

執行緒的同步問題 乙個程序中的多個執行緒是共享同一段資源的,由於執行緒對資源的競爭引出了鎖。其中mutex是一種簡單的加鎖方法,這個互斥鎖只有兩種狀態,那就是上鎖和解 鎖,可以把互斥鎖看作是某種意義上的全域性變數。在某一時刻,只能有乙個執行緒取得這個互斥上的鎖,擁有上鎖狀態的執行緒可以對共享資源進行...

C 多執行緒 之 互斥鎖mutex 的簡單使用

先看一下沒加鎖的 及輸出 include include using namespace std int i 0 公共資料 執行緒1函式 void aaa 執行緒2函式 void bbb intmain int argc,char ar 輸出 沒加鎖的結論 非常混亂 再看一下加了鎖之後的 及 輸出 ...

python之路 併發程式設計之程序 互斥鎖

互斥鎖 將多個任務對修改共享資料的操作由併發變為 序列 沒有互斥鎖的情況下 json檔案 執行檔案 import os import time import json import random from multiprocessing import process def check with o...