非分离线程返回后、join前,线程本地存储是否仍可访问?
线程本地存储在未join的已返回线程中的访问问题
绝对不能通过其他线程的指针访问这类线程本地存储,不管是C11标准的_Thread_local还是GCC扩展的__thread,这种操作属于未定义行为,具体原因如下:
_Thread_local(或__thread)变量的生命周期严格绑定所属线程的执行周期。当非分离线程的入口函数返回时,该线程的执行已经结束,其对应的所有线程本地存储对象会被立即销毁,内存资源会被运行时或操作系统回收、复用。此时通过指针访问这些已销毁的内存,会触发崩溃、数据错乱、程序异常等不可预测的结果。即使线程尚未被
pthread_join(或C11的thrd_join)调用,也不代表其TLS资源还处于可用状态。join操作的核心作用之一是等待线程资源完全回收,但线程返回后,TLS的销毁是执行结束后的必然步骤,这是标准明确规定的行为,依赖“未join就还能访问”的逻辑完全是错误的,属于依赖实现细节的非法操作。
内容的提问来源于stack exchange,提问作者Michal Butterweck
相关产品推荐
相关产品推荐

