c - 指向非线程本地数据的线程本地指针

标签 c linux multithreading gcc x86-64

我有一个数组,它不是线程本地的,如下所示。

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/

相关文章:

c - 我的交叉编译 makefile 有什么问题?

c - 关于pthread_join函数的问题

java - jdbc中的语句是否同步执行批处理

c++ - 线程上下文切换

无法打开 2 个文件 *

c - C中指针和数组的区别

c - for循环中的if语句 - 无限循环

c - Linux C代码异步启动另一个进程

php - Linux (centos) 上的 Codeigniter 类和文件名区分大小写

java - 是否可以在线程可运行的声明中将文件写入交互式 shell?