C 多執行緒如何訪問同乙個資料

2021-07-22 12:24:40 字數 1651 閱讀 4362

在多執行緒中,為了使資料保持一致性必須要對資料或是訪問資料的函式加鎖,在資料庫中這是很常見的,但是在程式中大部分都是單執行緒的程式,所以沒有加鎖的必要,但是在多執行緒中,為了保持資料的同步,一定要加鎖。

在framework中已經為我們提供了三個加鎖的機制,分別是monitor類、lock關鍵字和mutex類。

monitor和lock用法差不多,都是鎖定資料或是鎖定被呼叫的函式。mutex多用於鎖定多執行緒間的同步呼叫。

mutex只能互斥執行緒間的呼叫,但是不能互斥本執行緒的重複呼叫。執行下面程式,可以看出thread1中waitone()只對thread2中的waitone()起到互斥的作用,但是thread1並不受waitone()的影響,可以呼叫多次,只是在呼叫結束後呼叫相同次數的releasemutex()就可以。

private

void thread1func()

} private

void thread2func()

} private

void testfunc(string str)

", str, system.datetime.now.millisecond.tostring());

thread.sleep(50);

}

那麼如何使執行緒按照呼叫順序來依次執行呢?其實把lock和mutex結合起來使用就可以了。

private

void thread1func()

} } private

void thread2func()

} }

互斥鎖

a. 互斥鎖是乙個互斥的同步物件,意味著同一時間有且僅有乙個執行緒可以獲取它。

b. 互斥鎖可適用於乙個共享資源每次只能被乙個執行緒訪問的情況。

表示可由多個執行緒同時訪問的鍵/值對的執行緒安全集合。

任務方法

用法說明

新增的key值在字典內不存在

tryadd

如果當前不在字典中存在該鍵,此方法見剛新增制定鍵/值對。改方法返回true或false具體取決於是否已新增新對。

如果改登錄檔項具有特定值,更新為現有鍵在字典中值

tryupdate

此方法檢查是否key具有指定的值,如果它存在,則用新值更新該鍵。

無條件地將鍵/值對儲存在字典中,覆蓋已存在的鍵的值

dictionary[key]=newvalue

將鍵/值對新增到字典中,或如果key已存在,更新基於鍵的現有值的鍵的值

addorupdate

addorupdate(tkey, func, func) 接受的鍵和兩個委託。 如果鍵在字典; 中不存在,則使用第乙個委託它接受鍵並返回應新增的鍵的值。 如果該鍵不存在; 它使用第二個委託它接受的鍵和其當前值,並返回應為項設定的新值。addorupdate(tkey, tvalue, func) 接受鍵、 值要新增,以及更新委託。 這是與以前的過載中,相同之處在於它不使用委託來新增的鍵。

獲取此鍵在字典中,向字典中新增值並將其返回如果該鍵不存在的值

getoradd

這些過載提供延遲初始化為鍵/值對在字典中,新增的值,僅當不存在。getoradd(tkey, tvalue) 採用鍵不存在要新增的值。getoradd(tkey, func) 將乙個委託,可將生成的值,如果鍵不存在。

多執行緒併發同乙個表問題

table for update for update of a.id a1.有where條件時,鎖定條件中指定的資料行 行級封鎖 2.無where條件是,鎖定表a 表級封鎖 1.有where條件時,鎖定條件中指定的資料行 行級封鎖 2.無where條件是,鎖定表a 表級封鎖 a,b直接封鎖a,b表...

對於「多執行緒訪問同乙個變數是否需要加鎖」的研究

對於多執行緒訪問同一變數是否需要加鎖的問題,先前大家都討論過。今天用 驗證了一下之前的猜想 32位cpu與記憶體的最小交換資料為4位元組 次,這也是結構體要對齊4位元組的原因。在物理上,cpu對於同一4位元組的記憶體單元,不可能寫2個位元組的同時,又讀了3位元組。測試環境為 xeon 2cpu 2 ...

多執行緒迸發訪問同乙個資源不安全問題

第一種解決方案 1,等待和喚醒 flag標誌 notify 喚醒在此物件監視器上等待的單個執行緒。notify 喚醒在此物件監視器上等待的所有執行緒。第二種解決方案 1.使用鎖機制 在鎖機制中使用condition來替代監視器的等待和喚醒的方法,public inte ce condition co...