【发布时间】:2020-11-15 10:09:04
【问题描述】:
如果我有以下 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]。
【问题讨论】:
-
如果你不修改与其他线程访问相同的元素,它是 100% 安全的
-
@P__J__ 不相信这适用于所有架构和所有类型。
标签: c multithreading thread-safety pthreads