为什么这个非常简单的返回 std::move(线程句柄)失败
Why is this very simple return std::move(thread handle) failing?
#include <iostream>
#include <thread>
using namespace std;
thread&& launch(){
thread launchee([](){
this_thread::sleep_for(chrono::milliseconds(280));
cout<<"HA!"<<endl;
});
return move(launchee);
}
int main(int argc, char **argv){
thread mine(launch());
mine.join();
}
用g++-4.6 -std=c++0x 1.cpp -o e1 -pthread
编译
输出"终止调用而没有活动异常",然后程序中止。
这应该有效,不是吗?
您希望按值返回线程,而不是按右值引用返回:
std::thread launch() {
std::thread launchee([](){
std::this_thread::sleep_for(std::chrono::milliseconds(280));
std::cout<<"HA!"<<std::endl;
});
return launchee;
}
原因是std::move
(和std::forward
)只是从左值到右值引用的强制转换操作,但除非您使用它实际移动到其他对象中,否则原始对象将保持不变。在原始代码中,您随后引用本地对象并退出函数,然后函数内部的std::thread
被销毁并调用terminate
(根据std::thread
协定,对于任何其他对象,它只会返回对已销毁对象的悬空引用)。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 线程之间的布尔停止信号
- std::move在将std::string移动到另一个线程时出错
- 如何通过std ::承诺进入线程?由STD :: Move或STD :: Shared_ptr
- move()数据从线程返回
- 为什么这个非常简单的返回 std::move(线程句柄)失败