日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

竞态条件与临界区

發布時間:2023/12/31 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 竞态条件与临界区 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

在同一程序中運行多個線程本身不會導致問題,問題在于多個線程訪問了相同的資源。如,同一內存區(變量,數組,或對象)、系統(數據庫,web services等)或文件。實際上,這些問題只有在一或多個線程向這些資源做了寫操作時才有可能發生,只要資源沒有發生變化,多個線程讀取相同的資源就是安全的。

多線程同時執行下面的代碼可能會出錯:

1 public?class?Counter {
2 ????protected?long?count =?0;
3 ????public?void?add(long?value){
4 ????????this.count =?this.count + value;??
5 ????}
6 }

想象下線程A和B同時執行同一個Counter對象的add()方法,我們無法知道操作系統何時會在兩個線程之間切換。JVM并不是將這段代碼視為單條指令來執行的,而是按照下面的順序:

從內存獲取 this.count 的值放到寄存器 將寄存器中的值增加value 將寄存器中的值寫回內存

觀察線程A和B交錯執行會發生什么:

this.count = 0;A: 讀取 this.count 到一個寄存器 (0)B: 讀取 this.count 到一個寄存器 (0)B: 將寄存器的值加2B: 回寫寄存器值(2)到內存. this.count 現在等于 2A: 將寄存器的值加3A: 回寫寄存器值(3)到內存. this.count 現在等于 3

兩個線程分別加了2和3到count變量上,兩個線程執行結束后count變量的值應該等于5。然而由于兩個線程是交叉執行的,兩個線程從內存中讀出的初始值都是0。然后各自加了2和3,并分別寫回內存。最終的值并不是期望的5,而是最后寫回內存的那個線程的值,上面例子中最后寫回內存的是線程A,但實際中也可能是線程B。如果沒有采用合適的同步機制,線程間的交叉執行情況就無法預料。

競態條件 & 臨界區

當兩個線程競爭同一資源時,如果對資源的訪問順序敏感,就稱存在競態條件。導致競態條件發生的代碼區稱作臨界區。上例中add()方法就是一個臨界區,它會產生競態條件。在臨界區中使用適當的同步就可以避免競態條件。

轉載于:https://my.oschina.net/Chaos777/blog/267532

總結

以上是生活随笔為你收集整理的竞态条件与临界区的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。