c - 访问C数组线程中的不同元素是否安全?

标签 c multithreading thread-safety pthreads

假设我有以下C代码:

int my_global_arr[100];
或更笼统地说,
some_type *my_global_arr = malloc(some_size * sizeof(some_type);
在多个线程中同时访问(读和写)不同元素是否安全?
例如,如果我有
void *my_thread(void *index){
    int idx = *((int *)(index));
    my_global_arr[idx] = idx;
    return NULL;
}
并在main()
int a = 1;
int b = 2;
pthread_t thread1, thread2;
pthread_create(&thread1, NULL, my_thread, &a);
pthread_create(&thread2, NULL, my_thread, &b);

pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
是否可以保证两个线程不会互相干扰?
我的实验:
我尝试运行上面的“程序”,在x86_64 CPU上扩展到1000个线程,进行了100000次
在GCC 8.3.0中,-std = c99,看来它们不会互相干扰;
但是,我认为这样的实验不足以得出这样的访问权限是足够的
在所有平台上都是线程安全的。
编辑1 :
这个问题是关于在不同的地方访问不同的元素
线程,而不是不同线程中的同一元素;那是,
例如,thread-1读取/写入arr[1]thread-2读取/写入arr[2]

最佳答案

如果您可以保证一次只让一个线程访问每个元素,那么它是线程安全的。因为数组的每个元素(在物理上)都互不相同,这意味着它们是内存的独立部分。

关于c - 访问C数组线程中的不同元素是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63092262/

相关文章:

c - 在 64 位 Windows 上使用 vsnprintf 时出现问题

类之间的 Java 共享条件抛出 IllegalMonitorStateException : null

java - 同步映射或同步方法

c++ - std::atomic 的正确用法

java - 使用 request.getSession() 作为锁定对象?

c - 并行更新包含 1000000 个项目的数组

c - 如何使 clang 编译为 llvm IR

c++ - 有时无法从/proc/self/maps 获取堆栈范围

java - 非最终字段的同步

c - 我怎么知道换行符在我的环境中以何种方式表示?