C++11多线程thread参数传递问题
生活随笔
收集整理的這篇文章主要介紹了
C++11多线程thread参数传递问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//僅僅是構造一個線程類,但沒有和具體化的線程函數關聯
thread() noexcept;// 移動構造函數
thread( thread&& other ) noexcept;//構造新的 std::thread 對象并將它與執行線程關聯
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
上面就是C++11線程構造函數?。第三個構造函數是一個可以傳入多個參數的模板函數,也就是說傳給線程的執行函數的參數可以有任意多個。
其中f是任意一個可調用對象,包括普通函數、函數對象 、lambda表達式等,args是傳遞給線程函數的參數。
需要特別注意的是,傳到線程函數的參數默認是按值傳遞或者被移動的,若需要傳遞引用參數給線程函數,則必須包裝它(例如用 std::ref 或 std::cref )。
如下:
void pause_thread(int nSleepTime, int x, int y) {//std::cout << "pause for: " << nSleepTime << "\n";std::this_thread::sleep_for(std::chrono::seconds(nSleepTime)); }int main() {std::thread thread1(pause_thread, 1, 3, 4); }此時??nSleepTime參數為1, x為3,? y為4,必須注意的是:傳入的參數個數必須和線程的執行函數的參數個數相同,類型相同或可以轉化為同類型,否則編譯會報錯。
//代碼清單 1 //函數對象 class background_task { public:background_task(int number, char* pszName) :m_nNumber(number),m_pszName(pszName){}~background_task(){}void operator()() const{std::this_thread::sleep_for(std::chrono::seconds(2));//分離式情況下,m_pszName是非法指針std::cout << "number is: " << m_nNumber << " name is: " << m_pszName << std::endl;} private:int m_nNumber;std::string m_strName;char* m_pszName; }; // t1 非線程 std::thread t1; //使用普通函數進行構造線程,按值傳遞 void f1(int n){std::cout << n << std::endl;} std::thread t2(f1, 10);//使用函數對象構造線程,使用引用 background_task task(12, "jimmy"); std::thread run_task(std::ref(task));總結
以上是生活随笔為你收集整理的C++11多线程thread参数传递问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ross Young:苹果 iPhone
- 下一篇: C++11线程管理基础