我有一个数组,它不是线程本地的,如下所示。
long array[NTHREADS];
这里 array[0] 由线程 0 管理,array[1] 由线程 1 管理,依此类推。我们没有使用线程局部变量,因为在某些时候线程也必须读取其他线程的部分。但是,大多数时候他们会修改自己的部分。当然,我们可以使用 array[thread_id]
修改数据,但为了加快执行速度,我想使用指针。
现在由于每个线程都管理自己的数据,所以指针应该是线程本地的,并在开始时分配。所以我需要这样的东西(在 gcc 语法中)。
__thread long* tl_ptr;
tl_ptr = &array[threadid];
通过这种方式,我可以使用*tl_ptr
修改线程特定的数据。现在我的问题是,这种方法是否正确?这种做法有什么问题吗?
最佳答案
C++11 有一个内存模型,它定义了这些情况下的行为。 C 和 C++03 及更早版本本质上基本上是单线程的——没有原生原子/栅栏。
这意味着除非您使用 C++11 编译器(它实现了内存模型),否则您可能会由于缓存一致性问题等而产生奇怪的效果。这是特定于 cpu 的。
如果您知道您将在哪个处理器上运行,并且它具有适当的“强大”内存模型,您就可以确定您的方法是安全的,但不可移植。
关于c - 指向非线程本地数据的线程本地指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9909253/