Boost-在多个会话中对多个进程进行线程处理

Boost - Threading several processes over several sessions

本文关键字:线程 进程 处理 会话 Boost-      更新时间:2023-10-16

我目前在用boost处理几个不同的进程时遇到了几个问题。我对线程还很陌生,所以请耐心等待。希望格式也足够好。

我定义了两个线程。

boost::thread m_thread1;
boost::thread m_thread2;

与这些线程相关联的是三个期货和两个打包任务

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

我在标题中所说的会话的意思是,在后台有一些会话处理来告诉线程何时不创建。

还有其他代码进行一些处理和标志检查,但与我的问题无关。我显然误解了正在发生的事情。每个线程第一次运行时,它们就完成了任务。第二次程序崩溃了。

我很幸运地将每个线程变量作为指针,并每次定义一个新线程,而不是重新定义每个线程。这很有效,但我无法在完成后删除每个线程。我在这里不明白什么?函数返回结果后,线程实际在做什么?

auto_ptr是确保线程最终被删除的好方法。也是来自C++11的CCD_ 1。

根据:http://www.cplusplus.com

注意:此类模板(auto_ptr)自C++11起已弃用。uniqueptr是一个新功能,具有类似的功能,但具有改进的安全性(没有伪拷贝分配)、添加的功能(删除程序)和对阵列的支持。有关更多信息,请参阅unique_ptr。

有关使用auto_ptr的示例,请参阅有效使用auto_ptr。