【问题标题】:What exactly is join() in Boost::thread? (C++)Boost::thread 中的 join() 到底是什么? (C++)
【发布时间】:2011-09-08 15:54:32
【问题描述】:

在 Java 中,我会这样做:

Thread t = new MyThread();
t.start();

我通过调用 start() 方法来启动线程。所以以后我可以做类似的事情:

for (int i = 0; i < limit; ++i)
{
    Thread t = new MyThread();
    t.start();
}

创建一组线程并执行run()方法中的代码。

但是,在 C++ 中,没有 start() 方法。使用 Boost,如果我想要一个线程开始运行,我必须调用 join() 方法才能使线程运行。

#include <iostream>
#include <boost/thread.hpp>

class Worker
{
public:
    Worker() 
    {
        // the thread is not-a-thread until we call start()
    }

    void start(int N)
    {
        m_Thread = boost::thread(&Worker::processQueue, this, N);
    }

    void join()
    {
        m_Thread.join();
    }

    void processQueue(unsigned N)
    {
        float ms = N * 1e3;
        boost::posix_time::milliseconds workTime(ms);

        std::cout << "Worker: started, will work for "
                  << ms << "ms"
                  << std::endl;

        // We're busy, honest!
        boost::this_thread::sleep(workTime);
        std::cout << "Worker: completed" << std::endl;
    }

private:

    boost::thread m_Thread;
};

int main(int argc, char* argv[])
{
    std::cout << "main: startup" << std::endl;

    Worker worker, w2, w3, w5;

    worker.start(3);
    w2.start(3);
    w3.start(3);
    w5.start(3);

    worker.join();
    w2.join();
    w3.join();
    w5.join();
    for (int i = 0; i < 100; ++i)
    {
        Worker w;
        w.start(3);
        w.join();
    }
    //std::cout << "main: waiting for thread" << std::endl;    

    std::cout << "main: done" << std::endl;

    return 0;
}

在上面的代码中,for循环创建100个线程,通常我必须使用boost::thread_group来添加线程函数,最后用join_all()运行所有。但是,我不知道如何将线程函数放入一个使用各种类成员的类中。

另一方面,上述循环的行为与 Java 中的循环不同。它将使每个线程按顺序执行,而不是像其他单独的线程一样一次全部执行,它们自己的 join() 被调用。

Boost 中的 join() 到底是什么?另外请帮我创建一组共享同一类的线程。

【问题讨论】:

    标签: c++ multithreading boost


    【解决方案1】:

    join 不会启动线程,它会阻止您,直到您加入的线程完成。当你需要等待你开始的线程完成它的运行时,你可以使用它(例如 - 如果它计算了一些东西并且你需要结果)。

    启动线程的是boost::thread,它创建线程并调用您传递给它的线程函数(在您的情况下为Worker::processQueue)。

    您遇到循环问题的原因不是因为线程没有启动,而是因为您的主线程在完成之前没有等待它们执行。 我猜你在 Java 中没有看到这个问题,因为调度差异,也就是“未定义的行为”。 编辑后 在 Java 中,线程的行为略有不同,有关详细信息,请参阅下面的评论。这就解释了为什么你没有在 Java 中看到它

    Here's a question about the boost::thread_group。阅读问题和答案中的代码,它会对你有所帮助。

    【讨论】:

    • 在 Java 中,线程分为两种类型:普通(非守护进程)线程和守护线程,默认为非守护线程。 Java 进程在所有非守护线程都终止之前不会退出,因此 OP 观察到的很可能 not 是“未定义的行为”。
    • 好的,谢谢,很高兴知道。我不是Java程序员,所以我不知道细节。
    • 谢谢。这真的很有帮助。
    【解决方案2】:

    在 Boost 中加入线程与在 Java 中的作用相同:它等待线程完成运行。

    另外,如果我没记错的话,Boost 的线程在构造时运行。您没有明确启动它们。

    【讨论】:

      猜你喜欢
      • 2021-04-27
      • 1970-01-01
      • 2023-04-11
      • 2013-05-22
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多