本書說我們需要消除全局或靜態數據纔是線程安全的。我認爲線程安全意味着程序中沒有競爭條件。 但是,在以下示例中,爲了防止競爭條件,它將本地真正的「Point pt_ptr」從非指針類型更改爲指針類型「Point * pt_ptr」。我注意到他使用「malloc」,這意味着他將在堆中創建一些東西。堆中的東西被所有的線程共享......因爲它創建了共享的東西,它可以防止數據競爭,但它會是線程不安全的嗎?對C中的線程安全和競態條件感到困惑
int main(void) {
pthread_t tids[NUM_THREADS];
int i;
Point *pt_ptr;
for (i= 0; i < NUM_THREADS; i++) {
pt_ptr= malloc(sizeof(*pt_ptr));
pt_ptr->x= i;
pt_ptr->y= 3 * i + 2;
pthread_create(&tids[i], NULL, print_point, pt_ptr);
}
所以,是的,內存是共享的,可以被所有線程看到。然而,重要的部分是如果該數據實際上是由多個線程訪問的。如果他們不是 - 沒有問題,如果你有多個線程訪問數據,可能會有問題。所以你需要多告訴我們一些。你的「因爲它創建了共享的東西,所以它阻止了數據競爭」似乎也是錯誤的。 – nos
全局變量是共享內存的簡稱,但在這種情況下,pt_ptr不會被共享,它將爲每個線程分配一個新的私有內存。 – milevyo