1. 互斥量,mutex
[cpp]view plain
copy
#include
#include
using namespace std;
dword winapi thread1(lpvoid lpparmeter);
dword winapi thread2(lpvoid lpparmeter);
static handle g_hmutex = invalid_handle_value;
static int g_icnt = 100;
int main()
hthread1 = createthread(null, 0, thread1, null, 0, null);
hthread2 = createthread(null, 0, thread2, null, 0, null);
sleep(4000); // 讓2個執行緒有足夠的時間執行完操作。
closehandle(hthread1);
closehandle(hthread2);
system("pause");
return 0;
} dword winapi thread1(lpvoid lpparmeter)
else
} return 0;
} dword winapi thread2(lpvoid lpparameter)//thread data
else
} return 0;
} 幾個注意的地方:
(1)互斥量為核心物件,能夠與其他執行緒或特殊事件取得同步;
(2)速度比臨界區要慢;
(3)互斥量物件與所有其它核心物件的不同之處在於它是被執行緒所擁有的,互斥量物件除了記錄當前訊號狀態外,還要記住此時那個執行緒擁有它。
(4)這個常來被運用於限制程式啟動次數!
2.事件 event
[cpp]view plain
copy
#include
#include
using namespace std;
dword winapi thread1(lpvoid lpparmeter);
dword winapi thread2(lpvoid lpparmeter);
static handle g_hevent = invalid_handle_value;
static int g_icnt = 100;
int main()
/*handle createevent(
lpsecurity_attributes lpeventattributes, // security_attributes結構指標,可為null
bool bmanualreset, // 手動/自動
// true: 在waitforsingleobject後必須手動呼叫resetevent清除訊號
// false:在waitforsingleobject後,系統自動清除事件訊號
bool binitialstate, // 初始狀態
lpctstr lpname // 事件的名稱
);*/
hthread1 = createthread(null, 0, thread1, null, 0, null);
hthread2 = createthread(null, 0, thread2, null, 0, null);
setevent(g_hevent);
sleep(4000); // 讓2個執行緒有足夠的時間執行完操作。
closehandle(hthread1);
closehandle(hthread2);
system("pause");
return 0;
} dword winapi thread1(lpvoid lpparmeter)
else
} return 0;
} dword winapi thread2(lpvoid lpparameter)//thread data
else
} return 0;
} 幾個注意的地方:
(1).和mutex使用差不多,只有細微的差別;
(2).可以使用setevent或resetevent改變其狀態;
(3).在應用程式中任意一處沒有正確的按照規則呼叫setevent或resetevent,將達不到同步或互斥的目的;
(4).一般來說,都是利用event來進行同步,而不是我們這裡的讓它來達到互斥;
(5).event處於無訊號狀態時,相關執行緒或程序退出,系統並不會嘗試將其置為有訊號狀態;
3.臨界區 critical_section
[cpp]view plain
copy
#include
#include
using namespace std;
dword winapi thread1(lpvoid lpparmeter);
dword winapi thread2(lpvoid lpparmeter);
critical_section g_criticalsection; // 定義
static int g_icnt = 100;
int main()
dword winapi thread1(lpvoid lpparmeter)
else
} return 0;
} dword winapi thread2(lpvoid lpparameter)//thread data
else
} return 0;
} 幾個注意的地方:
(1).比mutex速度快;
(3). 臨界區一次只允許乙個執行緒訪問;
4.訊號量semaphore
首先說說那些關於訊號量那些不得不讓人傷心的事情,因為筆者大學不好學習,非常調皮,而訊號量又是老師最討論及考試的話題之一,所以我覺得這個東西非常扯淡,非常影響情緒,於是放在最後。------以上是為題外話。
為什麼大學老師總是喜歡訊號量呢?
因為這是乙個生產者-消費者模型,並且很多計算機問題都可以看做是生產者-消費者的問題,是同步最易理解的模型。
關於理論上的知識,我就不說了,書裡面很多的。
還有我不是很想實現生產者-消費者的模型,就用其他例子代替了。這個有點不負責任。
[cpp]view plain
copy
#include
#include
#include
using namespace std;
dword winapi thread1(lpvoid lpparmeter);
dword winapi thread2(lpvoid lpparmeter);
static handle g_hsemaphore = invalid_handle_value;; // 定義
static int g_icnt = 100;
int main()
hthread1 = createthread(null, 0, thread1, null, 0, null);
hthread2 = createthread(null, 0, thread2, null, 0, null);
sleep(4000); // 讓2個執行緒有足夠的時間執行完操作。
closehandle(hthread1);
closehandle(hthread2);
system("pause");
return 0;
} dword winapi thread1(lpvoid lpparmeter)
else
} return 0;
} dword winapi thread2(lpvoid lpparameter)//thread data
else
} return 0;
} 幾個注意的地方:
訊號量核心物件對執行緒的同步方式與前面幾種不同,它允許多個執行緒在同一時刻訪問某一資源,但是需要限制同一時刻訪問此資源的最大執行緒數目。
總結: 執行緒規模 = cpu 數 * 2 + 1
Windows下C 多執行緒同步
程式 是計算機指令的集合,它以檔案的形式儲存在磁碟上。而程序通常被定義為乙個正在執行程式的例項,是乙個程式在其自身位址空間的依次執行活動。程序 執行緒 由執行緒的核心物件和執行緒棧組成 當多執行緒訪問全域性變數時需要多執行緒同步 互斥物件 事件物件 關鍵 段 互斥物件 互斥獨享可以看做是一把房間鑰匙...
windows下C多執行緒
看到乙個簡單的windows程式設計例項,給大家分享一下 這個例項主要用createthread為乙個宣告的方法建立乙個程序,這個被建立的方法必須用dword winapi 修飾,需要有lpvoid 型別的引數,如果沒有這個引數,在建立程序時要對這個方法強制型別中轉換 dword winapi my...
Windows下多執行緒之間的互斥與同步
1.critical section 臨界區.它只能用於執行緒之間互斥 initializecriticalsection 2.互斥核心物件,可以用於執行緒之間互斥,也可於程序之間 createmutex 3.訊號量semaphore.可以用於執行緒之間同步,也可於程序之間 createsemaph...