避免同時訪問
為了避免與其他執行緒在訪問乙個全域性物件貨變數時發生衝突,需要在執行執行緒**時鎖定其他執行緒的執行,直至完成操作。vcl支援三種技術來達到這個目的:
(1) 鎖定物件:有些物件自己有鎖定的功能,如canvas
(2) 使用critical區
如果物件沒有提高內建的鎖定功能,需要使用critical區,critical區在同乙個時間只也許乙個執行緒進入。為了使用critical區,產生乙個tcriticalsection全域性的例項。tcriticalsection有兩個方法,acquire(阻止其他執行緒執行該區域)和release(取消阻止)
每個critical區是與你想要保護的全域性記憶體相關聯。每個訪問全域性記憶體的執行緒必須首先使用acquire來保證沒有其他執行緒使用它。完成以後,執行緒呼叫release方法,讓其他執行緒也可以通過呼叫acquire來使用這塊全域性記憶體。
警告:critical區只有在所有的執行緒都使用它來訪問全域性記憶體,如果有執行緒直接呼叫記憶體,而不通過acquire,會造成同時訪問的問題。例如:lockxy是乙個全域性的critical區變數。任何乙個訪問全域性x, y的變數的執行緒,在訪問前,都必須使用acquire
lockxy.acquire;
try
y := sin(x);
finally
lockxy.release;
end;
(3) 使用multi-read exclusive-write synchronizer
當你使用critical區保護全域性記憶體時,同乙個時間內只允許乙個執行緒使用這塊記憶體。這也許會超過你的要求,特別是對於那些經常讀而很少寫的物件或變數。在多執行緒內,當沒有執行緒對同樣的記憶體進行寫操作時,同時讀它是沒有任何問題。當你有一些全域性變數需要經常讀而很少寫時,可以使用tmultireadexclusivewritesynchronizer保護它們。這個物件象critical section, 但是當記憶體沒有執行緒在寫它時,允許多個執行緒讀取乙個記憶體。
為了使用multi-read exclusive-write synchronizer,產生乙個全域性的 tmultireadexclusivewritesynchronizer例項,與你想要保護的記憶體相關聯。每個執行緒如果項讀取該記憶體,必須先呼叫beginread方法。它確信沒有其他的執行緒在寫記憶體。讀完後,呼叫endread。寫記憶體時,呼叫beginwrite,寫完後,呼叫 endwrite。
警告:同critical section一樣,multi-read exclusive-write synchronizer也只有在所有的執行緒都使用它訪問同一塊全域性記憶體時才有效。直接訪問該記憶體將會導致同時訪問問題。
摘自:http://.yesky.***/20000319/35322.shtml
多執行緒中記憶體分配的一些看法
近來開發乙個儲存系統,在開發的過程中遇到一些之前沒有考慮過的問題,讓人記憶比較深刻的算是多執行緒中反覆申請與釋放記憶體。由於這個系統需要很強的穩定性,這就讓我很痛苦了一兩個星期。大家都知道在c 中用new 來分配記憶體,用delete 來釋放記憶體,這看似沒有任何問題,因為new與delete總是成...
關於linux中多執行緒程式設計的一些初級問題
include include include void func 0 void func 1 int threadproc if pthread create ttid 1 0,void func 1,null for i 0 i 2 i pthread join ttid i 0 return ...
java中多執行緒的一些知識
countdownlatch,乙個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允許乙個或多個執行緒一直等待。主要方法 public countdownlatch int count public voidcountdown public voidawait throws interrup...