在並行程式設計中,訪問臨界區是經常會遇到的問題,加鎖,釋放鎖是經常會使用到的解決方式。
例如:
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...