callable類型和多線程啟動(dòng)
- 返回值void,不接受參數(shù)的函數(shù)
void hello() { } std::thread t(hello); // 啟動(dòng)線程
- 類的實(shí)例,這個(gè)類支持void operator ()();
class background_task{ public: void operator ()() { do_something(); } }; background_task f; std::thread my_thread(f); // 啟動(dòng)線程 // 錯(cuò)誤示例1 std::thread my_thread(background_task()); // 錯(cuò)因 // 嘗試傳遞一個(gè)臨時(shí)的未命名的background_task類型的變量,企圖構(gòu)造一個(gè)線程并啟動(dòng) // 然而,這個(gè)會(huì)被編譯器解釋為一個(gè)函數(shù)聲明。 // 具體來(lái)說(shuō), // 就是一個(gè)返回類型為std::thread // 函數(shù)名為my_thread // 函數(shù)的參數(shù)類型是指向不接受參數(shù)同時(shí)返回background_task類型對(duì)象的函數(shù)的指針 // 換句話說(shuō)是 // 函數(shù)的參數(shù)類型是一個(gè)函數(shù)指針硼被,什么樣的函數(shù)指針呢?這個(gè)函數(shù)指針是指向不接受參數(shù)同時(shí)返回background_task類型對(duì)象的函數(shù) // 這個(gè)錯(cuò)誤的確非常的隱蔽渗磅,不得不說(shuō)真的強(qiáng)…… // // 如何正確的實(shí)現(xiàn)這個(gè)意圖呢嚷硫? std::thread my_thread( (background_task()) ); // 方法1 加一對(duì)小括號(hào) std::thread my_thread{background_task()}; // 方法2 改用新的統(tǒng)一初始化方法——使用大括號(hào)
本文里面的代碼大多來(lái)自于《C++并發(fā)變成實(shí)踐》中的例子代碼,版權(quán)不屬于我夺溢。