我正在學習C++ 11中的新多線程技術。幾乎我在網上閱讀的所有教程都教導如何啓動執行功能的新線程(或多個線程),以後如何加入(或拆離)線程(或線程),以及如何避免使用mutex
等的競速條件如何讓C++ 11線程運行多個不同的函數?
但是我沒有看到其中的任何一個顯示如何讓一個線程在程序的不同部分執行幾個函數。問題是,使用C++ 11線程,是否有可能實現以下目標?如果是這樣,怎麼樣? (舉個例子會很棒)。
void func1(std::vector<int> & data1){ ... }
void func2(std::vector<int> & data2){ ... }
// main function version I
int main(){
std::vector<int> data1;
// prepare data1 for func1;
std::thread t1(func1, std::ref(data1));
std::vector<int> data2;
// prepare data2 for func2;
if (func1 in t1 is done){
t1(func2, std::ref(data2));
}
t1.join();
return 0;
}
而且進一步,如果我想要把上述main
函數體進入一個循環,如下什麼。可能嗎?如果是這樣,怎麼樣?從cplusplus.com
//main function version II
int main(){
std::vector<int> bigdata1;
std::vector<int> bigdata2;
std::thread t1; // Can I do this without telling t1 the function
// to be executed?
for(int i=0; i<10; ++i){
// main thread prepare small chunk smalldata1 from bigdata1 for func1;
if(t1 is ready to execute a function){t1(func1, std::ref(smalldata1));}
// main thread do other stuff, and prepare small chunk smalldata2 from bigdata2 for func2;
if (func1 in t1 is done){
t1(func2, std::ref(smalldata2));
}
}
t1.join();
return 0;
}
爲什麼這個問題得到了downvoted?作爲學習C++ 11多線程的初學者,這不是一個合理的問題嗎? – Allanqunzi
我在線程中並不是專家,但我認爲你可以使用['std :: condition_variable'](http://en.cppreference.com/w/cpp/thread/condition_variable)來創建第二個線程等待第一個。另外,如果你能夠接觸到[這本書](http://www.amazon。com/C-Concurrency-Action-Practical-Multithreading/dp/1933988770),你可能會從執行大部分'std :: thread'的人那裏學到很多東西。 – vsoftco
你通常想要這樣的情況是一個線程安全的任務隊列和一個線程池來執行隊列中的任務。 'main'線程打包一個任務並將其推送到隊列中,池中的線程等待某些內容出現在隊列中,當它執行任務時,執行它,然後再等待隊列 –