在c++中,_beginthreadex 建立執行緒是很麻煩的。要求入口函式必須是類的靜態函式。
通常,可以採用thunk,或者模板來實現。
因c++ 11中引入了 std::async ,可以很好的解決這個問題了。
值得注意的是,在迴圈中 std::async 建立執行緒,我試了好多次總是失敗,後來看老外的**,採用 std::move解決了問題。
具體見實現**。
//即將該函式定義成已刪除的函式,任何試圖呼叫它的行為將產生編譯期錯誤。是c++11標準的內容。#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()
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...