充當讀 寫鎖定機制的物件

2021-10-01 09:49:30 字數 1255 閱讀 8900

介紹

我的目標是建立可以充當讀/寫鎖定機制的物件。任何執行緒都可以鎖定它以進行讀取,但是只有乙個執行緒可以鎖定它以進行寫入。在寫入執行緒釋放它之前,所有其他執行緒都將等待。在釋放任何其他執行緒之前,寫執行緒不會獲取互斥體。

我可以使用slim reader / writer鎖,但是:

它們不是遞迴的,例如,acquiresrwlockexclusive()如果同一執行緒較早呼叫同一函式,則對的呼叫將阻塞。

它們不可公升級,例如,已將鎖鎖定為讀取訪問許可權的執行緒無法將其鎖定為寫入操作。

它們不是可複製的控制代碼。

我可以嘗試c ++ 14,shared_lock但是我仍然需要c ++ 11支援。此外,我還不確定它是否可以真正滿足我的要求。

因此,我不得不手動實現它。由於缺少,刪除了普通的c ++ 11方法waitformultipleobjects (nyi)。現在具有公升級/降級功能。

rwmutex

這一節很簡單。

class rwmutex

簡單地建立乙個對映互斥的控制代碼。物件不可複製。

建立handle createif(bool keepreaderlocked = false)

handle e = threads[id];

if (!keepreaderlocked)

releasemutex(hchangemap);

return e;

}當呼叫lockread()或lockwrite()來鎖定物件時,將呼叫這個私有函式。如果當前執行緒還沒有將自己變為可能訪問這個互斥鎖的執行緒中,這個函式將為該執行緒建立乙個互斥鎖。**食譜:www.sheonline.cn如果其他執行緒已經鎖定這個互斥物件進行寫訪問,那麼這個函式就會阻塞,直到寫執行緒釋放這個物件為止。這個函式返回當前執行緒的互斥控制代碼。

鎖定讀取/釋放讀取

handle lockread()

void releaseread(handle f)

當您要鎖定物件以進行讀取訪問並稍後釋放它時,將呼叫這些函式。

鎖/釋放

void lockwrite()

waitformultipleobjects((dword)allthreads.size(), allthreads.data(), true, infinite);

// reader is locked

}void releasewrite()

當您希望鎖定物件以進行寫訪問並在稍後釋放它時,將呼叫這些函式。函式的作用是:

1.在鎖期間沒有註冊新執行緒

2.任何讀取執行緒都釋放了鎖

mysql的鎖定機制 MySQL鎖定機制

一 樂觀鎖與悲觀鎖 1.1 樂觀鎖與使用版本號實現樂觀鎖 樂觀鎖假設認為資料一般情況下不會造成衝突,所以在資料進行提交更新的時候,才會正式對資料的衝突與否進行檢測,如果發現衝突了,則對使用者返回錯誤資訊,讓使用者決定如何去處理。實現方式為版本號和時間戳。使用版本號時,可以在資料初始化時指定乙個版本號...

innodb外來鍵造成的鎖定機制

innodb支援外來鍵,但是由於外來鍵,也會對innodb表增加鎖定機制 所有的外來鍵相關的操作都在資料更改時,比如檢查資料完整性 增加鎖定等 假設乙個表為parent,乙個表為child,parent通過id和child的parent id相連線 在乙個session中set autocommit...

flock對檔案鎖定讀寫操作的問題

boolflock int handle,int operation int wouldblock flock 操作的 handle 必須是乙個已經開啟的檔案指標。operation 可以是以下值之一 flock 不能在 nfs 以及其他的一些網路檔案系統中正常工作。詳細資料請檢查你的作業系統文件。...