将参数移动到std::线程中
Moving an argument into a std::thread?
请考虑以下代码:
void h(M m2)
{
...
}
int main()
{
while (true) {
M m1 = ...;
std::thread t(h, std::move(m1));
t.detach();
}
}
在m1
被破坏之前,能否保证m2
是由m1
构建的正确的move
-d ?还是有比赛?
这个标准在我看来很清楚:
Effects:构造一个线程类型的对象。新的执行线程执行
INVOKE (DECAY_COPY ( std::forward<F>(f)), DECAY_COPY (std::forward<Args>(args))...)
并调用DECAY_COPY
正在构造线程中求值。
由于复制是在调用线程中进行的,因此必须在构造函数调用返回之前完成。
m2
的构造是从另一个对象(DECAY_COPY的结果)完成的,而不是从m1
完成的,因此m1
是否被销毁无关紧要。
DECAY_COPY的结果必须由实现存储在某个地方,以便在目标函数初始化之前它不会超出作用域,但这是实现的工作。销毁m1
对它没有任何影响。
相关文章:
- 为什么std::async使用同一个线程运行函数
- 在std::thread中,joinable()然后join()线程安全吗
- 在main()之外初始化std::vector会导致性能下降(多线程)
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 使用 std::string () const 函数启动线程或未来
- 用C++中的std::condition_variable将线程置于死锁中会有风险吗
- 即发即弃 std::线程对象清理自身
- std::mutex 如何防止线程修改?
- std::线程导致程序中止
- 如果在 2 个线程中使用,是否值得将size_t声明为 std::atomic?
- std::cout 来自多个线程
- 简单使用 std::atomic 在两个线程之间共享数据
- std::线程不是全局变量,但在到达创建它的函数的末尾时不会超出范围?
- 线程 std::调用未知类型,无法专门化函数错误
- 使用 std::chrono::steady_clock 对线程/异步中的代码进行基准测试
- 带有 std::cout 的多线程控制台文本动画
- 线程不是 std c++ 的成员
- ZeroMQ 在使用 std::thread 创建工作线程时崩溃
- 使用 std::condition_variable 触发其他线程.使用哪些互斥锁?
- 使用多线程(std::async、std::thread或?)加速