ucontext和线程局部存储

5
我想向您咨询的平台是Linux。 我所说的线程本地存储是gcc中的或<__thread>。
我想在我的程序中使用相关内容,例如makecontext、swapcontext等。所以我的问题是,它如何与线程本地存储一起工作?更具体地说,如果我使用swapcontext或setcontext切换到另一个fiber,那么线程本地存储是否也会改变,或者线程本地存储不是上下文的一部分?
另一个问题:如果TLS将被/更改,则是否有任何东西将粘附到线程上,无论我如何更改上下文?另一方面,如果TLS将粘附到上下文中,则是否有任何东西将粘附到线程上,并且不会被setcontext/swapcontext更改?
根据http://en.wikipedia.org/wiki/Fiber_(computer_science),Windows平台确实具有线程本地存储和纤程本地存储。
1个回答

2

线程本地存储与setcontext/swapcontext的交互方式并未明确定义。

在Linux上,线程本地存储不受setcontext/swapcontext的影响,一些软件依赖于这种行为——请参阅最近在netbsd邮件列表上的讨论以获取更多见解:swapcontext() around pthreads

还有一些关于C++中TLS与并行性相互作用的想法:TLS_and_Parallelism.pdf

编辑:值得指出的是,makecontext/swapcontext已从The Open Group Base Specifications Issue 7中删除,因为它们已被标记为过时。作为替代方案,Boost.Context最近已添加到Boost库中(虽然它也不支持纤程本地存储)。


谢谢,我验证了在Linux上上下文更改不会影响TLS。那么我的进一步问题是,在Linux中是否有任何光纤本地存储? - Kan Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接