天天看點

DIOCP開源項目-Delphi高性能無鎖隊列(lock-free)

最近想在DIOCP中加入任務排程線程,DIOCP的工作線程作為生産者(producer)将接受到的資料對象,投遞到任務排程線程中,然後統一進行配置設定。然而這一切都需要一個隊列, 這幾天都在關注無鎖隊列。

首先是一個隊列,簡單的隊列就是,生産者把資料壓入隊列(push), 消費者通過隊列Pop出資料進行處理。

簡單的隊列就是提供Push,和Pop函數。

我們用一個連結清單來存儲資料。Head ->data01->data02...data_n->Tail, 每個資料塊的結構如下

1.在進行Push壓入資料時壓入将Tail.next指向新壓入的資料塊, 然後用新的資料塊做Tail

2.在進行Pop資料時把Head資料塊取出,然後用Head資料塊指向的下一塊當作Head.

上面就是簡單的隊列

上面的實作的隊列在多線程情況下是不安全的。如果要在多并發下隊列要進行加鎖,在push和pop時加鎖也是一種辦法。可以直接用臨界就可以了,但是我們要做的是無鎖隊列

首先記住多并發設計規則:決不要假設任何代碼會連續執行

上面的push操作

也許執行了FTail.next:=pvData後,會被另外的線程搶走,然後FTail進行了新的指派,這樣在進行FTail := pvData;這樣整個資料鍊條就會被破壞。

如果這兩行我們能一次行完成,這樣就可以實作無鎖操作了,這樣我們需要引入原子操作.Interlocked中的函數。

說無鎖其實不太确切,隻是鎖的粒度小了。我們是使用api的InterlockedCompareExchange函數來實作的。

查一下MSDN

<a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms683560(v=vs.85).aspx">http://msdn.microsoft.com/en-us/library/windows/desktop/ms683560(v=vs.85).aspx</a>

<dl></dl>

<dt></dt>

Destination [in, out]

<dd></dd>

A pointer to the destination value.

Exchange [in]

The exchange value.

Comparand [in]

The value to compare to Destination.

The function returns the initial value of the Destination parameter.

大概解釋一下。這個函數是比較後進行交換。第一個參數是要存放目的的資料,第二個是交換資料,第三個是比較資料(與第一個比較), 如果交換傳回的資料和第三個參數一樣。

這樣就可以在push和pop一步完成。

這裡貼出push的pop操作

後續我會上傳完整的代碼到DIOCP項目中。

如有漏洞,敬請指出。歡迎假如DIOCP群讨論

繼續閱讀