使用下面的代码,我想将(push_back)线程放在向量中,并在每次弹出操作后从向量启动线程。
#include <iostream>
#include <thread>
#include <algorithm>
int main() {
std::vector<std::thread> workers;
for(int i = 0; i < 10; ++i){
workers.push_back(std::thread([](){
std::cout << "Hi from thread\n";
}));
}
std::cout << "Hi from main!\n";
std::for_each(workers.begin(), workers.end(), [](std::thread &th){
th.join();
});
return 0;
}
但是push_back()
指令实际上并没有表明我们正在存储线程以便稍后启动它。因为调用class std::thread
的构造函数会立即启动线程。
在java中,线程的启动可以通过放入队列(比如说)并将它出列像这样:
-> searchQueue.enqueue( new SearchTask( record, this ) );
-> return searchQueue.size () > 0 ? (Runnable) searchQueue.removeFirst () : null ;
因为在java中,在调用start()
的{{1}}方法后会启动线程。
那么,我如何在C ++ 11中执行类似的操作?
答案 0 :(得分:2)
您可以存储非运行的线程以及稍后将一起运行的函数:
typedef std::pair<std::thread, std::function<void()>> ThreadAndFunction;
std::vector<ThreadAndFunction> workers;
for(int i = 0; i < 10; ++i){
ThreadAndFunction tf;
workers.emplace_back(std::thread(), [](){
std::cout << "Hi from thread\n";
});
}
然后,使用以下函数激活线程:
for(int i = 0; i < 10; ++i){
workers[i].first = std::thread(workers[i].second);
}
但是,我不认为你在这里获得了很多。您可以先存储没有空线程的函数,然后再创建一个线程向量。