如果在std::thread
和主线程(或任何其他线程)之间有共享变量,那么即使您使用共享变量您在创建线程后立即执行thread::detach()
方法?C++ 11 std :: thread :: detach和对共享数据的访问
11
A
回答
16
是的!在调用detach()
之后,全局变量,捕获变量和传入变量仍可访问。
但是,如果您要调用detach,那么您可能希望从创建该线程的函数返回,从而允许线程对象超出范围。如果是这样的话,你必须注意,该函数的所有本地代码都不是通过引用或通过指针传递给线程。
您可以将detach()
视为线程不需要创建线程本地任何东西的声明。
在以下示例中,线程在超出作用域后始终在起始线程的堆栈上访问int
。这是未定义的行为!
void start_thread()
{
int someInt = 5;
std::thread t([&]() {
while (true)
{
// Will print someInt (5) repeatedly until we return. Then,
// undefined behavior!
std::cout << someInt << std::endl;
}
});
t.detach();
}
这里有一些可能的方式来保持地毯从你的线程下被扫地出门:
- 声明
int
的地方,不需要任何线程的生命周期内,不会超出范围它(也许是全球性的)。 - 声明共享数据为
std::shared_ptr
并将其按值传递给线程。 - 按值传递(执行副本)到线程中。
- 将rvalue引用(执行移动)传递到线程中。
5
是的。拆线只是意味着当它完成后它清理完毕,你不再需要,也不允许它,join
它。
相关问题
- 1. Boost :: thread,glut和数据共享
- 2. XCode std :: thread C++
- 3. 访问Pthreads共享数据
- 4. C++ 11线程detach不工作
- 5. MinGW和std :: thread
- 6. std ::线程访问从共享库加载的函数
- 7. std :: thread C++ 11无法解释为什么
- 8. C++共享互斥量和类实例的11个线程
- 9. 局部性和共享访问对象
- 10. 线程安全访问对象之间共享的数据
- 11. C++ fork/std :: thread和boost :: timed_join
- 12. 在C++中自动调用std :: thread的函数11
- 13. 项目66:同步对共享可变数据的访问
- 14. 在C++中使用原子和std :: thread 11
- 15. C++ 11共享Ptr,共享相同的引用计数器
- 16. 从std :: thread访问类变量
- 17. C#线程共享数据
- 18. C++访问共享库的数组数据
- 19. 编译共享库(旧标准)与C++ 11共享库
- 20. 多线程无法正常使用std :: thread(C++ 11)
- 21. 并行/异步访问共享数据
- 22. boost :: thread和std :: unique_ptr
- 23. C++ 11共享指针和存储器的矢量泄漏
- 24. C++共享指针问题
- 25. 使用std :: thread与std :: mutex
- 26. 什么时候应该使用std :: thread :: detach?
- 27. 访问共享内存中的数据C++ POSIX
- 28. 如何在C++ 11中的Mac OS X上命名std :: thread?
- 29. 共享对Google Bigquery数据集的访问
- 30. C++ 11可以判断std :: thread是否处于活动状态?