釋放閱讀鎖的函式原型為:public void releasereaderlock()。函式定義如下:
public void releasereaderlock()
bool breader = true; switch( flag )
if( !breader )
return;
thread.setdata( slot, lockflags.none );
m_mutex.waitone();
autoresetevent autoresetevent = null;
this.m_nactive --;
if( this.m_nactive == 0 )
else if( this.m_nwaitingwriters > 0)
} m_mutex.releasemutex();
if( autoresetevent != null )
autoresetevent.set();
} 釋 放閱讀鎖時,首先判斷當前執行緒是否擁有閱讀鎖(通過執行緒區域性儲存的標誌),然後判斷是否有等待的閱讀執行緒,如果有,先將當前活動執行緒加1,等待閱讀執行緒數 目減1,然後置事件為有訊號。如果沒有等待的閱讀執行緒,判斷是否有等待的寫入執行緒,如果有則活動執行緒數目減1,等待的寫入執行緒數目減1。釋放寫入鎖與釋放 閱讀鎖的過程基本一致,可以參看源**。
注意在程式中,釋放鎖時,只會喚醒乙個閱讀程式,這是因為使用autoresetevent的原歷,讀者可自行將其改成manualresetevent,同時喚醒多個閱讀程式,此時應令m_nactive等於整個等待的閱讀執行緒數目。
測試
C 多執行緒程式設計例項實戰 1
問題的提出 所謂單個寫入程式 多個閱讀程式的執行緒同步問題,是指任意數量的執行緒訪問共享資源時,寫入程式 執行緒 需要修改共享資源,而閱讀程式 執行緒 需要讀取資料。在這個同步問題中,很容易得到下面二個要求 1 當乙個執行緒正在寫入資料時,其他執行緒不能寫,也不能讀。2 當乙個執行緒正在讀入資料時,...
c 多執行緒程式設計(2)
1 建立事件物件 handle createevent lpsecurity attributeslpeventattributes sdboolbmanualreset reset typeboolbinitialstate initial statelpctstrlpname object na...
C 多執行緒程式設計簡單例項
using system using system.collections using system.collections.generic using system.threading 在開發中經常會遇到執行緒的例子,如果某個後台操作比較費時間,我們就可以啟動乙個執行緒去執行那個費時的操作,同時程...