人如何将使用 packaged_task 创建的线程(在 boost 中)放入 shared_ptr 向量中
How can man put a thread(in boost) which is created with packaged_task, into a shared_ptr vector
这是来自 boost 库的示例。
int calculate_the_answer_to_life_the_universe_and_everything()
{
return 42;
}
boost::packaged_task<int> pt(calculate_the_answer_to_life_the_universe_and_everything);
boost:: future<int> fi=pt.get_future();
而不是 boost::thread task(boost::move(pt));
在线程上启动任务,
现在我想将线程放入 shared_ptr 向量并在线程上启动任务。
首先我创建一个矢量。
std::vector<std::shared_ptr<boost::thread>> vecThreads;
这是将线程放入 vector 的正确方法吗?
vecThreads.push_back(std::make_shared<boost::thread>(boost::packaged_task<int> &pt));
谢谢大家的关注!
打包任务就是这样。他们没有 "have" 线程。
他们只是 运行 在一个线程上。任何线程。
事实上,为每个任务启动一个线程是一种反模式。但是,当然,你可以。我建议使用
boost::thead_group tg;
tg.create_thread(std::move(pt));
所以你可以依赖
tg.join_all();
等待所有挂起的线程完成。
更新
对于共享指针,这里有一个例子:
#include <boost/thread.hpp>
#include <boost/make_shared.hpp>
#include <boost/bind.hpp>
using namespace boost;
int ltuae(int factor) {
this_thread::sleep_for(chrono::milliseconds(rand()%1000));
return factor*42;
}
int main() {
std::vector<unique_future<int> > futures;
std::vector<shared_ptr<thread> > threads;
for (int i=0; i<10; ++i)
{
packaged_task<int> pt(bind(ltuae, i));
futures.emplace_back(pt.get_future());
threads.emplace_back(make_shared<thread>(std::move(pt)));
}
for (auto& f : futures)
std::cout << "Return: " << f.get() << "\n";
for (auto& t: threads)
if (t->joinable())
t->join();
}
这是来自 boost 库的示例。
int calculate_the_answer_to_life_the_universe_and_everything()
{
return 42;
}
boost::packaged_task<int> pt(calculate_the_answer_to_life_the_universe_and_everything);
boost:: future<int> fi=pt.get_future();
而不是 boost::thread task(boost::move(pt));
在线程上启动任务,
现在我想将线程放入 shared_ptr 向量并在线程上启动任务。
首先我创建一个矢量。
std::vector<std::shared_ptr<boost::thread>> vecThreads;
这是将线程放入 vector 的正确方法吗?
vecThreads.push_back(std::make_shared<boost::thread>(boost::packaged_task<int> &pt));
谢谢大家的关注!
打包任务就是这样。他们没有 "have" 线程。 他们只是 运行 在一个线程上。任何线程。
事实上,为每个任务启动一个线程是一种反模式。但是,当然,你可以。我建议使用
boost::thead_group tg;
tg.create_thread(std::move(pt));
所以你可以依赖
tg.join_all();
等待所有挂起的线程完成。
更新
对于共享指针,这里有一个例子:
#include <boost/thread.hpp>
#include <boost/make_shared.hpp>
#include <boost/bind.hpp>
using namespace boost;
int ltuae(int factor) {
this_thread::sleep_for(chrono::milliseconds(rand()%1000));
return factor*42;
}
int main() {
std::vector<unique_future<int> > futures;
std::vector<shared_ptr<thread> > threads;
for (int i=0; i<10; ++i)
{
packaged_task<int> pt(bind(ltuae, i));
futures.emplace_back(pt.get_future());
threads.emplace_back(make_shared<thread>(std::move(pt)));
}
for (auto& f : futures)
std::cout << "Return: " << f.get() << "\n";
for (auto& t: threads)
if (t->joinable())
t->join();
}