c++ - ucontext 和线程本地存储

标签 c++ linux gcc pthreads thread-local-storage

我问的平台是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平台确实有thread-local storage和fiber-local storage。

最佳答案

没有很好地指定线程本地存储如何与 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 库中(尽管它也不支持光纤本地存储)。

关于c++ - ucontext 和线程本地存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12381716/

相关文章:

c++ - OpenCV c++ 示例到 iOS 项目

c - gcc 如何确定基于 C 的函数将使用的堆栈大小?

c++ - Progmem 中的数组下标错误?

C#访问在ubuntu 18.04服务器上被拒绝的路径

c++ - 为什么 gcc 和 msvc 允许 const 对象没有用户提供的构造函数?这是一个错误吗?

c++ - libuv - 自由写入缓冲区

c++ - 如何处理头文件中的非ARC代码?

C++ 发送击键疑难解答

linux - 在 nohup 模式下运行时的不同行为(linux shell)

linux - 将两个定界符分隔变量的列表通过管道传输到 BASH 中的新命令