下面的代码示例实际上可以一次执行一个1个线程。保持对线程的引用,然后调用' Thread.join'以后某个时候会产生同样的效果。如何让这些线程以这样的方式运行,程序等待线程独立并行地继续,然后退出?在我看来,必须使用其他一些内核对象信令机制。 (简而言之,使用' join'将主线程绑定到辅助线程并不让其他线程同时运行?)
int main() {
while (cin) {
getline(cin, input_line);
if (input_line.length()>0)
{
thread t = thread(SomeLengthyCheck, input_line);
t.join();
}
}
}
答案 0 :(得分:1)
您通常使用线程数组,然后在for循环中等待所有这些数组。
你不在乎订单,因为最终所有订单都应该完成。
在你的情况下,你需要一个线程堆栈/队列,因为你不知道你需要等多少线程。
int main() {
std::vector<std::thread> threads;
std::string input_line;
while (getline(std::cin, input_line)) {
if (input_line.length()>0) {
threads.push_back(std::thread(SomeLengthyCheck, input_line));
}
}
for (auto& th : threads) th.join();
}
编辑:@ o11c
建议的异常安全版本class vthreads : std::vector<std::thread> {
~vthreads() { for (auto& th : *this ) th.join(); }
};
int main() {
vthreads threads;
std::string input_line;
while (getline(std::cin, input_line)) {
if (input_line.length()>0) {
threads.push_back(std::thread(SomeLengthyCheck, input_line));
}
}
}
答案 1 :(得分:0)
我不是Linux的专家,但我认为线程附加到main
的进程,所以当任何线程与主线程异步操作时,只需return
进入主要有os关闭进程并附上所有子线程。
否则我相信当封闭的{}
当全局变量发生这种情况时,您可以向主进程发出信号。
此外,我认为你对加入感到困惑。通过停止调用线程直到要连接的线程完成,加入一个异步线程(函数)基本上同步运行。