我很困惑信號量是原子的意味著什么。等待和信號的定義如下。
wait(S){
while ( S<= 0)
; // Busy wait
S--;
}
signal(S) {
S ;
}
書上說
在 wait() 和 signal() 操作中對大二的整數值的所有修改都必須以原子方式執行。即當一個行程修改信號量值時,其他行程不能同時修改同一個信號量值
這是否意味著,沒有其他指令可以執行之間while(S<=0)和S--?修改信號量值的程序是在什么時候完成的?這是當它最終減少 S-- 時嗎?
uj5u.com熱心網友回復:
這是否意味著在 while(S<=0) 和 S-- 之間沒有其他指令可以執行?
不。這意味著所有修改(例如S--)必須以原子方式完成,也就是說,沒有其他行程可以同時嘗試修改S,例如,通過執行S in signal。
修改信號量值的程序是在什么時候完成的?這是當它最終減少 S-- 時嗎?
正如解釋所說,每次修改都必須是原子的。所以它在每次修改結束時修改了值。它可能會再次修改它,但這將是一個獨特的修改,也必須是原子的。
您可以將“原子修改”視為不與任何其他原子訪問或修改重疊的修改。是S 與S--不是原子操作,操作可能會迷路,如果,例如,兩個行程執行S 和他們的業務重疊。他們都可以 read S,都可以 increment S,然后都可以 write S,導致S只增加一次。
uj5u.com熱心網友回復:
任何操作的原子性意味著:要么發生,要么不發生。如果某個執行緒 A 對某個資料集合或某個物件執行原子操作,并且執行緒 B 檢查物件/資料,則執行緒 B 必須看到操作開始前的物件/資料,或者操作開始后的物件/資料操作完成。“原子”意味著執行緒 B 不可能看到處于中途完成狀態的物件/資料。
我們可以通過在訪問資料時使用synchronized塊或ReentrantLock物件來提供原子性,但是如果有人告訴您某個物件是原子的,那么他們所說的是,您可以對其執行的所有操作*自動保證是原子的,而不是你必須明確鎖定任何東西。
* 除非特殊情況,在物件的檔案中提到。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/349304.html
