C 執行緒同步筆記

2021-08-10 21:38:47 字數 2602 閱讀 4419

多執行緒實現執行緒同步有三種方式:互斥物件、事件物件和關鍵**段。

主要函式:

示例**如下:

#include#includedword winapi fun1proc(lpvoid lpparameter); //新執行緒1的入口函式宣告,函式的名稱fun1proc可任意取

dword winapi fun2proc(lpvoid lpparameter); //新執行緒1的入口函式宣告

int tickets = 100;

handle hmutex;

void main()

{handle hthread1;

handle hthread2;

//引數2:true表示建立互斥物件的執行緒獲取物件的所有權;3:互斥物件的名稱,null表示匿名

hmutex = createmutex(null,false,null);

/*引數1:null表示使用預設的安全性;2:執行緒初始棧的大小,0表示預設使用與呼叫該函式的執行緒相同的棧空間大小;

3:新執行緒的入口函式;4:可通過這個引數給新執行緒傳遞引數;5:0表示執行緒建立後立即執行,create_suspended表示執行緒

建立後處於暫停狀態,需要呼叫resumethread執行;6:用來接收執行緒id*/

hthread1 = createthread(null,0,fun1proc,null,0,null);

hthread2 = createthread(null,0,fun2proc,null,0,null);

/*closehandle關閉對新建立的執行緒的引用,並不是終止新執行緒。還會遞減執行緒核心物件的使用計數,當使用計數為0時,系統就會釋放該執行緒核心物件,

如果不關閉執行緒控制代碼,只有等到程序終止時,系統才會清理這些物件*/

closehandle(hthread1);

closehandle(hthread2);

cout<

sleep(1);

cout<

sleep(1);

cout注意點:

主要函式:

示例**如下:

#include#includedword winapi fun1proc(lpvoid lpparameter);

dword winapi fun2proc(lpvoid lpparameter);

int tickets = 100;

handle hevent;

void main()

{handle hthread1;

handle hthread2;

//建立事件物件。引數2:true表示是人工重置事件物件,false表示自動重置事件物件;3:指定事件物件的初始狀態,true表示有訊號,反之;4:事件物件的名字,null表示匿名

hevent = createevent(null,false,true,null);

hthread1 = createthread(null,0,fun1proc,null,0,null);

hthread2 = createthread(null,0,fun2proc,null,0,null);

closehandle(hthread1);

closehandle(hthread2);

cout<

sleep(1);

cout<

sleep(1);

cout注意點:

主要函式:

示例**如下:

#include#includedword winapi fun1proc(lpvoid lpparameter);

dword winapi fun2proc(lpvoid lpparameter);

int tickets = 100;

critical_section g_cs;

void main()

{handle hthread1;

handle hthread2;

hthread1 = createthread(null,0,fun1proc,null,0,null);

hthread2 = createthread(null,0,fun2proc,null,0,null);

closehandle(hthread1);

closehandle(hthread2);

//初始化關鍵**段--相當於建造乙個**亭

initializecriticalsection(&g_cs);

cout<

sleep(1);

cout<

sleep(1);

cout注意點:

在編寫多執行緒同步時,很容易發生執行緒死鎖。哲學家進餐問題可以形象的描述執行緒死鎖現象:有多位哲學家在一起吃飯,每個人只有一根筷子,無法吃飯。大家都希望其他哲學家可以交出筷子讓自己先吃飯,最後只能乾瞪眼盯著桌上的美食挨餓。

在多執行緒中,如果執行緒1擁有臨界區物件a,並且等待獲取臨界區物件b,而執行緒2擁有臨界物件b,並且還在等待獲取臨界物件a,就造成了死鎖。

C 執行緒同步 (學習筆記)

1.利用mutex 互斥物件 2.利用event 事件物件 3.利用臨界區 critical section 效率更高 4.利用semaphore訊號量 filename semaphore test.cpp author jarvischu date 2012 11 22 include incl...

C 執行緒同步

volatile是最簡單的一種同步方法,當然簡單是要付出代價的。它只能在變數一級做同步,volatile的含義就是告訴處理器,不要將我放入工作記憶體,請直接在主存操作我。www.bitscn.com 因此,當多執行緒同時訪問該變數時,都將直接操作主存,從本質上做到了變數共享。能夠被標識為volati...

c 執行緒同步

以乙個程式來說明執行緒不同步所帶來的問題 class program private int counter 0 private void actionmethod t thread.currentthread.name,counter 結果如下 從上面的結果中可以看到主線程和子執行緒都在爭奪act...