【问题标题】:Boost - Threading several processes over several sessionsBoost - 在多个会话中线程化多个进程
【发布时间】: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


【解决方案1】:

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

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

注意:此类模板 (auto_ptr) 自 C++11 起已弃用。 unique_ptr 是一个具有类似功能的新工具,但具有更高的安全性(无虚假复制分配)、添加的功能(删除器)和对数组的支持。有关更多信息,请参见 unique_ptr。

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

【讨论】:

    猜你喜欢
    • 2012-08-14
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多