[英]What exactly is join() in Boost::thread? (C++)
在 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添加线程function,最后用join_all()运行所有。 但是,我不知道如何将线程 function 放入使用各种 class 成员的 class 中。
另一方面,上述循环的行为与 Java 中的循环不同。 它将使每个线程按顺序执行,而不是像其他单独的线程那样一次执行,它们自己的 join() 被调用。
Boost 中的 join() 到底是什么? 另外请帮助我创建一组共享相同 class 的线程。
join
不会启动线程,它会阻止你,直到你加入的线程完成。 当您需要等待开始的线程完成其运行时(例如 - 如果它计算某些内容并且您需要结果),您可以使用它。
启动线程的是boost::thread
,它创建线程并调用您传递给它的线程 function (在您的情况下 - Worker::processQueue
)。
循环出现问题的原因不是因为线程没有启动,而是因为您的主线程在完成之前没有等待它们执行。
我猜你在 Java 中没有看到这个问题,因为调度差异,也就是“未定义的行为”。
编辑后在 Java 中,线程的行为略有不同,有关详细信息,请参阅下面的评论。 这就解释了为什么您在 Java 中没有看到它。
这是关于boost::thread_group
的问题。 阅读问题和答案中的代码,它将对您有所帮助。
在 Boost 中加入线程的作用与在 Java 中的作用相同:它等待线程完成运行。
另外,如果我没记错的话,Boost 的线程在构造时运行。 您没有明确启动它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.