c 多執行緒(四)

2021-06-19 03:14:23 字數 2495 閱讀 6458

執行緒間通訊

主線程建立子執行緒必定會為主執行緒分擔一部分工作,這樣不可避免的會在這兩個執行緒之間存在訊息傳遞渠道,因此主線程和子執行緒之間要進行通訊。

下面介紹幾種通訊方式:

全域性變數:由於同一程序的各個執行緒之間共享該程序的資源,因此,解決執行緒間通訊最簡單的方式是使用全域性變數。對於標準型別的全域性變數,使用validate修飾符,不讓編譯器對其優化,因為編譯器如果對其優化,可能會導致執行緒間讀取資料的不準確。例如乙個變數num:

[cpp]view plain

copy

intnum;  

num = 1;  

num = 2;  

如果編譯器進行優化,則會直接把2賦值給num。但是可能num=1,執行緒一使用;num=2,執行緒二使用。優化完以後則就發生資料不準確了。所以在前面的例項中,使用全域性變數,都是帶有validate修飾符。

自定義訊息:

可以在乙個執行緒中向另乙個執行緒傳送訊息來實現執行緒之間的通訊。乙個執行緒向另乙個執行緒傳送訊息是通過作業系統實現的。當乙個執行緒傳送乙個訊息,操縱系統首先接收到訊息,然後把此訊息**到目的執行緒。

多執行緒例項6-----自定義訊息實現執行緒間通訊

此例項實現簡單1到50,1到100,1到150相加,然後把相加結果顯示出來。計算結果採用乙個子執行緒實現(calculatethread類,繼承自cwinthread類),然後把計算結果通過訊息傳送給主線程。

部分**:

calculatethread.cpp

[cpp]view plain

copy

// calculatethread.cpp : implementation file

//#include "stdafx.h"

#include "mthread7.h"

#include "calculatethread.h"

#include "mthread7dlg.h"

#ifdef _debug

#define new debug_new

#undef this_file

static

char

this_file = __file__;  

#endif

/// ccalculatethread

implement_dyncreate(ccalculatethread, cwinthread)  

ccalculatethread::ccalculatethread()  

ccalculatethread::~ccalculatethread()  

bool

ccalculatethread::initinstance()  

intccalculatethread::exitinstance()  

begin_message_map(ccalculatethread, cwinthread)  

//}afx_msg_map

end_message_map()  

/// ccalculatethread message handlers

lresult

ccalculatethread::oncalculate(

wparam

wparam, 

lparam

lparam)  

sleep(500);  

//::postmessage(afxgetmainwnd()->getsafehwnd(),wm_display,itemp,0);

postmessage(getmainwnd()->getsafehwnd(),wm_display,itemp,0);  

return

0;  

}  

主線程主要是建立子執行緒,並且傳送計算訊息給子執行緒,並且把計算需要的引數通過訊息傳送給計算執行緒。

部分**如下:

[cpp]view plain

copy

lresult

ccalculatethread::oncalculate(

wparam

wparam, 

lparam

lparam)  

sleep(500);  

//::postmessage(afxgetmainwnd()->getsafehwnd(),wm_display,itemp,0);

postmessage(getmainwnd()->getsafehwnd(),wm_display,itemp,0);  

return

0;  

}  

執行結果:

C 多執行緒系列(四)

parallel類定義了for foreach和invoke的靜態方法。parallel類使用多個任務,因此使用多個執行緒來完成這個作業。parallel.for 方法類似於c 的for迴圈語句,也是多次執行乙個任務。使用parallel.for方法,可以並行執行迭代。迭代的順序沒有定義。paral...

詳解c 多執行緒(四)

為了避免多個執行緒同時修改全域性變數,c 11除了提供互斥量mutex這種方法以外,還提供了atomic模版函式。使用atomic可以避免使用鎖,而且更加底層,比mutex效率更高。為了方便使用,c 11為模版函式提供了別名。atomic別名 atomic bool atomic別名 atomic ...

C 多執行緒 四 多執行緒的自動管理 執行緒池

在多執行緒的程式中,經常會出現兩種情況 一種情況 應用程式中,執行緒把大部分的時間花費在等待狀態,等待某個事件發生,然後才能給予響應 這一般使用threadpool 執行緒池 來解決 另一種情況 執行緒平時都處於休眠狀態,只是周期性地被喚醒 這一般使用timer 定時器 來解決 threadpool...