簡體   English   中英

訪問 C 數組線程中的不同元素是否安全?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM