我该如何像这样启动多个线程:
for (i = 0; i < 10; i++) {
std::thread (myfunction, i, param2, param3);
}
没有加入?
我该如何像这样启动多个线程:
for (i = 0; i < 10; i++) {
std::thread (myfunction, i, param2, param3);
}
没有加入?
试试这个
for (int i = 0; i < 10; ++i) {
std::thread{myfunction, i, param2, param3}.detach();
}
如果您希望稍后加入线程,则可以将它们放在一个std::vector
中。
std::vector<std::thread> v;
for (int i = 0; i < 10; ++i) {
v.emplace_back(myfunction, i, param2, param3);
}
// Do something else...
for (auto& t : v) {
t.join();
}
只需不调用join()
,改用detach()
。
当然你可以创建一些线程而不加入它们,就像你平常所做的那样:
for (i = 0; i < 10; i++) {
std::thread my_thread {myfunction, i, param2, param3};
}
一旦创建了一个线程,它就开始被安排运行或等待。然而,我建议你不要这样做。
"join" 的意思是要求当前线程等待您调用 join 的线程。例如:
#include <iostream>
#include <thread>
using namespace std;
// A dummy function
void foo(int n)
{
cout << "This is a dummy function." << endl;
}
// Another dummy function
void bar(char c) {
cout << "This is another dummy function." << endl;
}
int main()
{
thread foo_thread(foo, 2);
thread bar_thread(bar, 'x');
foo_thread.join(); // wait for foo_thread to finish
bar_thread.join(); // wait for bar_thread to finish
return 0;
}
主线程将休眠,直到foo_thread和bar_thread完成。
如果您删除foo_thread.join()和bar_thread.join(),则主线程可能会在foo和bar之前完成并返回。这将导致程序崩溃。因为在main函数结束时,将调用foo_thread和bar_thread的析构函数,并且std::thread的析构函数将检查该线程是否可连接。如果线程未分离,则可连接。如果线程可连接,则析构函数将调用std::terminate(),从而导致程序崩溃。
std::terminate
?可加入线程的析构函数会调用join
,因此即使删除foo_thread.join()
和bar_thread.join()
,该程序的行为也应完全相同。 - Ap31