[英]Is access to different elements in a C array thread safe?
假設我有以下 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 中訪問數組的不同元素是完全線程安全的。
如果您可以保證一次,每個元素只能由一個線程訪問,那么它就是線程安全的。 因為數組的每個元素都彼此不同(物理上),這意味着它們是 memory 的獨立部分。
訪問不同的元素將始終是 100% 安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.