我正在遇到几个问题,同时使用boost来处理几个不同的进程。我对线程很新,所以请耐心等待。希望格式化也足够好。
我定义了两个线程。
boost::thread m_thread1;
boost::thread m_thread2;
与这些线程相关联的是三个期货和两个packaged_tasks
boost::packaged_task<bool> ptaskBool;
boost::packaged_task<double> ptaskDouble;
boost::unique_future<bool> futureBool;
boost::unique_future<double> futureDouble1;
boost::unique_future<double> futureDouble2;
这两个线程都是在while循环中定义的
while(running)
{
//some code
if(!thread1running)
{
ptaskBool = boost::packaged_task<bool>(boost::bind(/*some objects function*/));
futureBool = ptaskBool.get_future();
m_thread1 = boost::thread(boost::move(ptaskBool));
thread1running = true;
}
if(!thread2running && initial)
{
ptaskDouble = boost::packaged_task<bool>(boost::bind(/*some objects function*/));
futureDouble = ptaskDouble.get_future();
m_thread2 = boost::thread(boost::move(ptaskDouble));
thread2running = true;
}
else if(!thread2running)
{
ptaskDouble = boost::packaged_task<bool>(boost::bind(/*some different function*/));
futureDouble2 = ptaskDouble.get_future();
m_thread2 = boost::thread(boost::move(ptaskDouble));
initial = true;
thread2running = true;
}
这是对我所拥有的简化,但它非常相似。我的下一个代码是期货。
if(futureBool.is_ready())
{
m_bool = futureBool.get();
thread1running = false;
}
if(futureDouble.is_ready())
{
m_double = futureDouble.get();
std::cout << "Result: " << m_double << std::endl;
thread2running = false;
//have tried several things like a join here to no avail
}
if(futureDouble2.is_ready())
{
m_double = futureDouble2.get();
std::cout << "Result: " << m_double << std::endl;
thread2running = false;
}
}//end while
标题中的会话我的意思是在后台有一些会话处理,用于告诉线程何时何时不创建。
还有其他代码可以进行一些处理和标记检查,但它与我的问题无关。我显然误解了正在发生的事情。每个线程第一次运行时,都会完成任务。程序第二次崩溃。
我很幸运每个线程变量都是指针并且每次都定义一个新线程而不是重新定义每个线程。这有效,但我无法在完成后删除每个线程。我在这里不理解什么?函数返回结果后实际执行的操作是什么?
答案 0 :(得分:0)
auto_ptr是确保最后删除线程的好方法。也是来自C ++ 11的unique_ptr
。
注意:从C ++ 11开始,不推荐使用此类模板(auto_ptr)。 unique_ptr是一个具有类似功能的新工具,但具有更高的安全性(无伪造复制分配),添加的功能(删除器)和对阵列的支持。有关其他信息,请参阅unique_ptr。
有关使用auto_ptr。
的示例,请参阅Using auto_ptr Effectively