C 11 執行緒呼叫類的成員函式解決辦法

2022-03-26 14:32:33 字數 1520 閱讀 7862

在c++中,_beginthreadex 建立執行緒是很麻煩的。要求入口函式必須是類的靜態函式。

通常,可以採用thunk,或者模板來實現。

因c++ 11中引入了 std::async ,可以很好的解決這個問題了。

值得注意的是,在迴圈中 std::async 建立執行緒,我試了好多次總是失敗,後來看老外的**,採用 std::move解決了問題。

具體見實現**。

//

#include

"stdafx.h

"#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef uint(winapi*threadproc)(lpvoid);

class

xtest

; ~xtest() {};

uint xtest::runloop(lpvoid obj)

return0;

}uint xtest::xfh()

, 0, 0, null);

//auto pppp = (&xtest::runloop);

//ulong_ptr* kkkk = (ulong_ptr*)&pppp;

std::list>lk;

for (int i =0 ; i<8 ; i++)

);auto __p = std::async(std::launch::async, &xtest::runloop, this

, (lpvoid)i);

//__p.wait(); 不可以呼叫。否則會變成同步了。

lk.push_back(std::move(__p)); //

這裡必須要用move,否則就會變成同步了。。測試是會報錯。

//auto k = std::thread([this , i]() );

}

//此行**用於等執行緒結束,會阻塞主線程。

for (auto &e : lk)

cout

<< "

等執行緒結束

"<

sleep(

1000

);

return0;

}};

intmain()

即將該函式定義成已刪除的函式,任何試圖呼叫它的行為將產生編譯期錯誤。是c++11標準的內容。

lk.push_back(std::move(__p)); ,若果不用move的話會報錯

因為future的拷貝建構函式已經被定義為刪除delete函式。所以需要用move轉移控制權。

c 多執行緒 類成員函式 C 11中多執行緒庫

執行緒是在作業系統層面支援的,所以多執行緒的學習建議還是先找一本linux系統程式設計類的書,了解linux提供執行緒的api,了解使用執行緒設計程式的基本操縱。完全使用系統呼叫編寫多執行緒程式是痛苦,現在有很多封裝好的多執行緒庫,幫助簡單快速的使用執行緒程式設計,了解作業系統提供的api對理解多執...

c 11類的靜態成員

一 類靜態成員和類成員之間的區別 1.靜態成員在類的所有物件中是唯一且共享的。2.靜態成員即使在類物件不存在的情況下也能使用。靜態成員只要使用類名加範圍解析運算子 就可以訪問。3.靜態成員分為靜態成員函式和靜態成員變數。4.靜態成員可以使用或訪問其他靜態成員。靜態成員不能使用或訪問該類的非靜態成員即...

c 11 以類內成員函式初始化執行緒

更新,忘記當時寫的具體是啥了 大概就是下面這個意思 今天敲了這樣一段 簡化版本 include include include using namespace std class t void func int main 我在 1 的部分得到報錯 error invalid use of non s...