Win32執行緒鎖的一種高效實現

2021-09-29 04:42:40 字數 3001 閱讀 2561

最近看 msdn 中的一些資料,有感於世界變化真快,從前掌握的鎖的知識實在膚淺;於是毫不猶豫地將其拖入**站,順便也有了這篇文章。

在這裡我不貼上 msdn 中的大段敘述,也不複述鎖的知識。僅談新鎖的特點:

1、根據 os 版本來決定執行緒切換方式: win9x 用 sleep, winnt 用 switchtothread。

呼叫 sleep(0) 時,呼叫執行緒雖會放棄剩餘時間片,但仍保持 ready 狀態。而 switchtothread 會促使 os 重新排程執行緒,並可能使低優先順序的執行緒執行;該介面在 win9x 系統中不可用。

2、根據 cpu 個數來決定是否 spin: 單 cpu 直接切換執行緒, 多 cpu 則 spin。

和 initializecriticalsectionandspincount 相似,單處理器系統直接切換執行緒,不進行 spin 處理。    實現**如下:

// --------------------- code begin -----------------------

class cspininterlocked

~cspininterlocked()

void lock(void)

void unlock(void)  

private:

typedef void (cspininterlocked::*pfun)(void);

long volatile _atomic_mutex;

int _spin_count;

pfun _switch_thread;

pfun _lock;

void lock_single_processor(void)   

}void lock_multi_processor(void)

if (i >= _spin_count) }}

}void switch_thread_9x(void)

//#define _win32_winnt 0x0400

void switch_thread_nt(void)

};// ---------------------- code end ------------------------

對 cspininterlocked 進行了簡單測試,在 winxp sp2 + intel p4 ht 2.8g 上, 直覺上  criticalsection 比 cspininterlocked 效率高。這也許是超執行緒的影響。

相比 criticalsection 只能用於程序內的執行緒間的侷限,如果把 cspininterlocked 實現在共享記憶體中,則可以用於程序間。

附測試**:

// --------------------- code begin -----------------------

cspininterlocked g_lock = cspininterlocked(get_processor_num(), is_win9x());

// get_processor_num(): 獲取處理器數;

// is_win9x(): 判斷 os 是否是 win9x?

int g_count = 0;

int _add_types = 10000;

dword winapi threadfunc( lpvoid lpparam )

cout << "thread quit:" << _id << endl;

g_lock.unlock();

return exit_success;

}int main(void)

}::sleep(2000);

// 不加鎖時, g_count 一般應該小於 20 * 10000.

// 成功加鎖後, g_count 應該等於 20 * 10000.

cout << "g_count=" << g_count << endl;

if (g_count != 20 * 10000) 

}// ---------------------- code end ------------------------

測試用例的一種輸出結果如下:

thread start:0

thread quit:0

thread start:8

thread quit:8

thread start:4

thread quit:4

thread start:5

thread quit:5

thread start:16

thread quit:16

thread start:2

thread quit:2

thread start:1

thread quit:1

thread start:19

thread quit:19

thread start:13

thread quit:13

thread start:14

thread quit:14

thread start:15

thread quit:15

thread start:12

thread quit:12

thread start:7

thread quit:7

thread start:6

thread quit:6

thread start:11

thread quit:11

thread start:18

thread quit:18

thread start:3

thread quit:3

thread start:10

thread quit:10

thread start:9

thread quit:9

thread start:17

thread quit:17

g_count=200000

Win32多執行緒程式設計 一

1.程序 從win32的角度來看,程序就是一大堆物件的擁有權的集合,程序擁有的物件包括記憶體和資源兩類 程序擁有的記憶體 被程序擁有的記憶體可以分為以下三個型別 1 code code是程式的可執行部分,一定是唯讀性質 2 data data是程式中的所有變數 不包括函式中的區域性變數 可以分為全域...

win32 執行緒的互斥和同步

1.首先說的是什麼是互斥,什麼是同步。以前我覺的互斥和同步是乙個感念,最起碼在哲學上這倆個東西的目的是一致的,但是其實互斥和同步還是不一樣的。具體來說我們以資源來舉例子。互斥 是對於同一資源,每一時刻只能其中乙個執行緒操作,至於是a執行緒還是b執行緒,這個無所謂,反正就是ab不能同時來操作臨界資源。...

《win32多執行緒程式設計》讀後感(一)

一本好書就是能給人以提示,讓人有種撥雲見日的感覺,這本書就是。但凡一本關於多執行緒的書裡面肯定少不了關於作業系統的論述,是啊,兩者的關係太緊密了,在 windows 中,系統是以執行緒為單位來分配時間片的。當我們在 windows 下寫程式時,哪怕只是最簡單的 hello world 你的程式也有個...