可以替换 std::thread 个对象吗?
Is it ok to replace std::thread objects?
根据我在 C++ 在线文档中收集到的信息,分配给连接的 std::thread 对象应该调用其析构函数并代表合法操作。是这样吗?
这里有一些例子可以说明我的意思:
#include <thread>
#include <vector>
using namespace std;
int main()
{
vector<thread> tvec;
for(int = 0; i < 3; ++i)
{
tvec.push_back(thread(foo));
}
for(size_t i = 0; i < 3; ++i)
{
tvec[i].join();
tvec[i] = thread(foo); // is this ok?
}
for(auto& t : tvec)
{
t.join();
}
}
assigning to a joined std::thread
object should call its destructor
不应该!析构函数仅在对象被销毁时调用,因此得名。
and represents a legitimate operation
只要线程不可连接就可以(如您的示例中的情况)。否则,将调用 terminate
。
如果你要阅读标准,而不是在线阅读可疑的 "documentation",你会在 [thread.thread.assign]
中找到
Effects: If joinable()
, calls terminate()
. Otherwise, assigns the state of x
to *this
and sets x
to a default constructed state.
在线程上调用赋值运算符会检查线程是否为 joinable()
,如果是,则调用 std::terminate()
。如果不是,则它将右侧线程的状态分配给被分配给的线程。然后它使右侧的线程处于默认构造状态。
这称为移动分配。实际赋值运算符被删除。
根据我在 C++ 在线文档中收集到的信息,分配给连接的 std::thread 对象应该调用其析构函数并代表合法操作。是这样吗?
这里有一些例子可以说明我的意思:
#include <thread>
#include <vector>
using namespace std;
int main()
{
vector<thread> tvec;
for(int = 0; i < 3; ++i)
{
tvec.push_back(thread(foo));
}
for(size_t i = 0; i < 3; ++i)
{
tvec[i].join();
tvec[i] = thread(foo); // is this ok?
}
for(auto& t : tvec)
{
t.join();
}
}
assigning to a joined
std::thread
object should call its destructor
不应该!析构函数仅在对象被销毁时调用,因此得名。
and represents a legitimate operation
只要线程不可连接就可以(如您的示例中的情况)。否则,将调用 terminate
。
如果你要阅读标准,而不是在线阅读可疑的 "documentation",你会在 [thread.thread.assign]
中找到Effects: If
joinable()
, callsterminate()
. Otherwise, assigns the state ofx
to*this
and setsx
to a default constructed state.
在线程上调用赋值运算符会检查线程是否为 joinable()
,如果是,则调用 std::terminate()
。如果不是,则它将右侧线程的状态分配给被分配给的线程。然后它使右侧的线程处于默认构造状态。
这称为移动分配。实际赋值运算符被删除。