最近看 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 你的程式也有個...