我要问的平台是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平台确实具有线程本地存储和光纤本地存储。
答案 0 :(得分:2)
没有明确规定线程本地存储如何与setcontext / swapcontext进行交互。
在Linux上,线程本地存储不受setcontext / swapcontext的影响,并且某些软件依赖于该行为 - 请参阅netbsd邮件列表上的最新讨论以获得进一步的见解:swapcontext() around pthreads
关于TLS与C ++中的并行性交互的一些想法:TLS_and_Parallelism.pdf
编辑:值得指出的是,makecontext / swapcontext已从The Open Group Base Specifications Issue 7中删除,因为它们已被标记为已淘汰了一段时间。作为替代方案,最近已将Boost.Context添加到Boost库中(尽管它也不支持光纤本地存储)。