核心物件執行緒同步 信標核心物件

2021-05-27 17:27:38 字數 1521 閱讀 4226

信標核心物件用於對資源進行計數。

乙個使用數量

乙個是最大資源數量(用於標識信標能夠控制的資源的最大數量)

乙個是當前資源數量(用於標識當前可以使用的資源的數量)

• 如果當前資源的數量大於0,則發出信標訊號。

• 如果當前資源數量是0,則不發出信標訊號。

• 系統決不允許當前資源的數量為負值。

• 當前資源數量決不能大於最大資源數量。

handle createsemaphore(

psecurity_attribute psa,

long linitialcount,

long lmaximumcount,

pctstr pszname);

引數psa見核心物件的安全性

引數pszname見-跨越程序邊界共享核心物件【命名物件】

lmaximumcount引數用於告訴系統,應用程式處理的最大資源數量是多少。由於這是個帶符號的32位值,因此最多可以擁有2147483647個資源。

linitialcount引數用於指明開始時(當前)這些資源中有多少可供使用。

通過呼叫等待函式,傳遞負責保護資源的信標的控制代碼,執行緒就能夠獲得對該資源的訪問權。從內部來說,該等待函式要檢查信標的當前資源數量,如果它的值大於0(信標已經發出訊號),那麼計數器遞減1,呼叫執行緒保持可排程狀態。信標的出色之處在於它們能夠以原子操作方式來執行測試和設定操作,這就是說,當向信標申請乙個資源時,作業系統就要檢查是否有這個資源可供使用,同時將可用資源的數量遞減,而不讓另乙個執行緒加以干擾。只有當資源數量遞減後,系統才允許另乙個執行緒申請對資源的訪問權。

handle opensemaphore(

dword fdwaccess,

bool binherithandle,

pctstr pszname

);

通過呼叫releasesemaphore函式,執行緒就能夠對信標的當前資源數量進行遞增:

bool releasesemaphore(

handle hsem,

long lreleasecount,

plong plpreviouscount);

該函式只是將lreleasecount中的值新增給信標的當前資源數量。通常情況下,為lreleasecount引數傳遞1,但是,不一定非要傳遞這個值。我常常傳遞2或更大的值。該函式也能夠在它的*plpreviouscount中返回當前資源數量的原始值。實際上幾乎沒有應用程式關心這個值,因此可以傳遞null,將它忽略。

開始時,沒有客戶機提出任何請求,因此我的伺服器不允許執行緒池中的任何執行緒成為可排程執行緒。但是,如果3個客戶機請求同時到來,那麼執行緒池中應該有3個執行緒處於可排程狀態。使用信標,就能夠很好地處理對資源的監控和對執行緒的排程,最大資源數量設定為5,因為這是我進行硬編碼的緩衝區的大小。當前資源數量最初設定為0,因為沒有客戶機提出任何請求。當客戶機的請求被接受時,當前資源數量就遞增,當客戶機的請求被提交給伺服器的執行緒池時,當前資源數量就遞減。

執行緒同步 核心物件實現執行緒同步 事件核心物件

1 事件核心物件23 事件型別物件有兩種不同型別,手動重置和自動重置 4手動重置 當乙個手動重置物件被觸發時候,等待該物件的所有執行緒變為可排程。5自動重置 當乙個自動重置物件被觸發時,只有乙個等待該事件的執行緒會變為可排程67 下面是乙個建立事件核心物件的函式 8handle createeven...

用核心物件進行執行緒同步 事件核心物件

事件核心物件 1.手動重置事件 當乙個手動重置事件被觸發的時候,所有等待該事件的執行緒都變為可排程狀態。所以要注意此時所有的執行緒都只能以唯讀的方式來訪問記憶體,這也是多個執行緒能夠同時執行的唯一原因 2.自動重置事件 當乙個自動重置事件被觸發的時候,只有乙個等待該事件的執行緒都變為可排程狀態 當執...

核心物件執行緒同步 概述

使用者方式同步的優點是它的 同步速度非常快。但它也有其侷限性。例如,互鎖函式家族只能在單值上執行,根本無法使執行緒進入等待狀態。可以使用關鍵 段使執行緒進入等待狀態,但是只能用這些 段對單個程序中的執行緒實施同步。還有,使用關鍵 段時,很容易陷入死鎖狀態,因為在等待進入關鍵 段時無法設定超時值。核心...