gpt4 book ai didi

c++ - 模拟线程局部变量

转载 作者:行者123 更新时间:2023-11-28 07:20:26 25 4
gpt4 key购买 nike

我想为非静态成员模拟线程局部变量,像这样:

template< typename T, unsigned int tNumThread >
class ThreadLocal
{
private:

protected:
T mData[tNumThread];

unsigned int _getThreadIndex()
{
return ...; // i have a threadpool and each thread has an index from 0 to n
}

public:
ThreadLocal() {};
~ThreadLocal() {};

T& operator ->()
{
return mData[_getThreadIndex()];
}
...
};

但问题是线程数将在运行时确定,我必须从堆中分配mData

我想知道有没有什么办法可以像上面那样不使用堆分配而使用常规数组?

最佳答案

每个线程都有自己的栈,记住栈帧在函数返回时被弹出(或者可以被认为是弹出)。

这就是我们拥有“无堆栈 python”的原因,因为 1 个堆栈(python 需要的)和多个线程并不能很好地发挥作用(请参阅全局解释器锁)

你可以把它放在 main 中,它会持续,但记住 C(++) 想要在编译时知道所有的大小,所以如果线程数改变(在编译时不固定)就没有办法知道这一点。

您真正想要的是不在 main 中的东西,但这不会是一个模板(在数字中),因为在编译时无法知道该数字。

GCC 提供了一个堆栈分配函数(如 malloc),但我找不到它,但最好避免使用它,因为这样优化才真正起作用。

同样不要低估你的 CPU 预读能力和 GCC 优化,将数组放在堆上也不错。

有趣的阅读和精美的图片,但不幸的是与主题的关系不大: http://www.nongnu.org/avr-libc/user-manual/malloc.html

关于c++ - 模拟线程局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19564088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com