...還是我必須寫我自己的? (順便說一句,我在工作c)在通用C庫中是否有TestAndSet(volatile int * lock)函數?
我在寫類似於維基百科什麼是一個實現:
volatile int lock = 0;
void Critical() {
while (TestAndSet(&lock) == 1);
critical section // only one process can be in this section at a time
lock = 0 // release lock when finished with the critical section
}
但我似乎無法找到一個預置的TestAndSet(volatile int *lock)
。他們可能是什麼樣子
例子包括:
#define LOCKED 1
int TestAndSet(volatile int* lockPtr) {
int oldValue;
oldValue = *lockPtr;
*lockPtr = LOCKED;
return oldValue;
}
理想情況下,我想的東西,可以在Linux和Windows工作。同樣,我讀過原子指令的執行是依賴於硬件的。我不確定這是否會影響事物,或者如何判斷硬件是否支持它,然後運行替代方案。
謝謝!
額外的上下文信息: 我問這個問題的原因是一組用於訪問數據結構功能的發展(如添加()取()刪除()等...)幾個線程正在訪問它進行修改和實時顯示某些元素。
互斥體: 因爲關鍵區域不是整個散列表,而是特定的成員被給定的函數訪問,所以我投反對互斥體(糾正我,如果我的理由是沒有根據的)。因此使用互斥鎖會導致整個數據結構的性能瓶頸。
替代: 是什麼讓我看到TestAndSet()是因爲在數據結構中的每個元素上放置一個「beingAccessed」標誌更有意義。這個標誌將被一個想要訪問它的函數檢查,如果它是假的,那麼它將被設置爲true,然後該函數將做它必須做的事情,然後釋放那個元素而不凍結整個結構。
評論@ M.M: @chux和您都提到的原因,示例實現不正確。 對於忙碌的等待,我的理解是,它在較低的級別上用於開發更高級別的同步機制。請參閱我的編輯上面的re:mutexes。 volatile不是爲了確保原子性,而是爲了確保每次訪問它時由原子函數檢查它的值,因爲多個線程可以隨時修改該變量。 我想象/希望的原子性是由作用於所討論的變量的函數提供的。 問題具體到你寫的東西:你的代碼說:「注意:不要使用」volatile「」但你提供的標準函數原型是易失性的,所以非易失性標誌變量在原子函數中被轉換爲volatile?謝謝。
N.B.我添加了「易失性」部分。這不是我找到的原始例子。 –
'oldValue = * lockPtr;'和'* lockPtr = LOCKED;'保持'lockPtr'不變? – chux
@chux - 我知道對不對?這就是爲什麼我不確定是否丟失了某些東西,或者有關於我不知道的指針的屬性 –