【发布时间】:2014-01-03 16:41:21
【问题描述】:
我目前在使用 boost 处理几个不同的进程时遇到了几个问题。我对线程相当陌生,所以请耐心等待。希望格式也足够好。
我定义了两个线程。
boost::thread m_thread1;
boost::thread m_thread2;
与这些线程相关的是三个 futures 和两个 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
我在标题中所说的会话的意思是,在后台有一些会话处理来告诉线程何时以及何时不被创建。
还有其他代码可以进行一些处理和标志检查,但与我的问题无关。我显然误解了正在发生的事情。每个线程第一次运行时,它们都会完成它们的任务。程序第二次崩溃了。
我很幸运地将每个线程变量设为指针并每次都定义一个新线程,而不是重新定义每个线程。这有效,但我无法在完成后删除每个线程。我在这里不明白什么?函数返回结果后线程到底在做什么?
【问题讨论】:
-
乍一看,我认为您的代码需要重新设计。我在代码中看到了很多潜在的问题,但很难说是什么问题。例如,1) 您检查 futureBool.isReady(),但随后访问 futureSpeechBool 2) 谁将 threadXrunning 设置回 false?您确定您没有创建可能相互影响的重叠任务吗?
-
另外,为了解决您的问题“函数返回结果后线程实际上在做什么?”,您指的是哪个函数?
-
抱歉,复制粘贴时遗漏了一个变量。修好了。
-
每个线程运行的函数是完全独立的。这些函数接收图像等数据,并使用与每个任务相关联的对象。功能与图像处理有关。
标签: c++ multithreading boost