我讀程序使用POSIX線程(由大衛Butenhof),他利用並行線程庫中提到:無論是直接或等待一個通過pthread庫的內存可視性?
無論內存值線程可以看到,當解鎖一個互斥體, 條件變量,也可以是任何線程看到的後續鎖定相同的互斥鎖的 。同樣,鎖定互斥鎖後寫入的數據 可能不一定會被鎖定互斥鎖的線程看到,即使寫入發生在鎖定之前。
突然,我不知道下面的代碼是否有效:
線程A:
strcpy(buffer, "hello world");
pthread_spin_lock(&lock); // assuming the mutex in the statement above can be interchanged with spinlock. I don't see why it can't
pthread_spin_unlock(&lock);
線程B:
pthread_spin_lock(&lock);
pthread_spin_unlock(&lock);
// read buffer; assuming thread B has a copy of the pointer somehow
我的問題是:線程B在緩衝區中看到「hello world」?根據他的說法,它應該。我明白「通常」的做法是通過鎖定來保護共享的「資源」。但假設strcpy()發生在隨機時間,並且它只能在程序生命週期中發生一次,並假設線程B以某種方式在線程A調用pthread_spin_unlock()後調用pthread_spin_lock():
Side question :是否有更快的方式使更改緩衝對其他線程可見?假設可移植性不是問題,我在CentOS上。我能想到的另一種方法是使用mmap(),但不確定是否有任何更改是全局可見的,而不使用pthread庫。
我認爲mmap()的概念是可行的,因爲它允許不同的進程看到相同的內存,更不用說線程了。 – Jiminion
@Jim謝謝你的回覆。嗯... mmap()可能適用於MAP_SHARED。不知道是否有更快的方式。 – Hei