i++只需要執行一條指令,並不能保證多個執行緒i++,操作同乙個i,可以得到正確的結果。因為還有暫存器的因素,多個cpu對應多個暫存器。每次要先把:
i從記憶體複製到暫存器
在暫存器中i++
再把i複製到記憶體中,
這需要至少3步。從這個意義上講,說i++是原子的並不對。i++不是原子操作
如此,假設兩個執行緒的執行步驟如下:
1. 執行緒a執行第一次i++,取出記憶體中的i,值為0,存放到暫存器後執行加1,此時cpu1的暫存器中值為1,記憶體中為0;
2. 執行緒b執行第一次i++,取出記憶體中的i,值為0,存放到暫存器後執行加1,此時cpu2的暫存器中值為1,記憶體中為0;
3. 執行緒a繼續執行完成第99次i++,並把值放回記憶體,此時cpu1中暫存器的值為99,記憶體中為99;
4. 執行緒b繼續執行第一次i++,將其值放回記憶體,此時cpu2中的暫存器值為1,記憶體中為1;
5. 執行緒a執行第100次i++,將記憶體中的值取回cpu1的暫存器,並執行加1,此時cpu1的暫存器中的值為2,記憶體中為1;
6. 執行緒b執行完所有操作,並將其放回記憶體,此時cpu2的暫存器值為100,記憶體中為100;
7. 執行緒a執行100次操作的最後一部分,將cpu1中的暫存器值放回記憶體,記憶體中值為2;
8. 結束!
所以該題目便可以得出最終結果,最小值為2,最大值為200。
count =0;
x=8421;
while(x)
刷題 力扣 21
題目鏈結 題目描述 將兩個公升序鍊錶合併為乙個新的 公升序 鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 1 輸入 l1 1,2,4 l2 1,3,4 輸出 1,1,2,3,4,4 示例 2 輸入 l1 l2 輸出 示例 3 輸入 l1 l2 0 輸出 0 題目分析 根據題目描述...
2023年6月的思考
先來一張鼓舞人心的圖 一 前端技術發展 來自gmtc見聞 1.前端發展進化史 時間特點 代表作2003 結構樣式行為分離 html,css,js 2008 工程化時代開啟 yslow,grunt,webpack,babel 2013 前後端分離,全棧化演進 node.js,graphql,koa 2...
LeetCode刷題筆記 6
題目 答案 對於所有整數 k,1.行0中的字元位於索引k 2 numrows 2 處 2.行numrows 1 中的字元位於索引k 2 numrows 2 numrows 1 處 3.內部的行i中的字元位於索引k 2 numrows 2 i 以及 k 1 2 numrows 2 i處 class s...