c – ucontext和线程本地存储

我要问的平台是
linux.我正在谈论的线程本地存储是gcc中的pthread_xxx或__thread.

我想在我的程序中使用ucontext的东西,即makecontext,swapcontext等.所以我的问题是,它如何与线程本地存储一起使用?更具体地说,如果我使用swapcontext或setcontext切换到另一个光纤,线程本地存储是否也会更改,或者线程本地存储不是上下文的一部分?

另一个问题:如果TLS将被setcontext / swapcontext更改,那么无论我如何更改上下文,是否有任何东西会坚持线程?另一方面,如果TLS将坚持上下文,那么是否有任何东西会坚持线程并且不会被setcontext / swapcontext更改?

根据http://en.wikipedia.org/wiki/Fiber_(computer_science),Windows平台确实具有线程本地存储和光纤本地存储.

最佳答案 它没有明确规定线程本地存储如何与setcontext / swapcontext交互.

在Linux上,线程本地存储不受setcontext / swapcontext的影响,并且某些软件依赖于该行为 – 请参阅netbsd邮件列表上的最新讨论以获得进一步的见解:swapcontext() around pthreads

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

编辑:还值得指出的是,makecontext / swapcontext已从The Open Group Base Specifications Issue 7中删除,因为它们已被标记为已淘汰了一段时间.作为替代方案,最近在Boost库中添加了Boost.Context(尽管它也不支持光纤本地存储).

点赞