C++线程疑问:线程函数内的函数调用是否归属该线程?
问题解答
一、method2()和method3()的执行线程
- 肯定的,
method1()在你创建的独立线程tmethod1里运行,那它内部调用的method2()和method3()百分百在同一个独立线程里执行。 - 函数调用是当前线程执行流的一部分,
method1()的整个执行逻辑都在tmethod1线程的上下文里,不会给内部的函数调用单独开新线程。
另外提个代码里的坑:
你创建线程时传的
obj是值拷贝,线程里会生成一个One的副本,不是main里的原对象。要是想操作原对象,得传引用(用std::ref(obj)包装)或者指针:std::thread tmethod1(&One::method1, std::ref(obj)); // 或者用指针 std::thread tmethod1(&One::method1, &obj);
二、detach后线程能否在main结束后继续运行
- 不行。当
main线程跑完,整个进程直接终止,进程里所有线程(包括已经detach的)都会被操作系统强制叫停,不管任务有没有做完。 std::thread::detach()只是让线程和std::thread对象解绑,不用再调用join()等它,但改变不了进程终止时销毁所有线程的规则。- 要是想让线程的任务完整执行,要么在
main结束前调用tmethod1.join()等它做完,要么搞个后台进程的架构(这得靠操作系统的进程管理,不是C++标准库能搞定的)。
内容的提问来源于stack exchange,提问作者sonofel
相关产品推荐
相关产品推荐

