6月21 刷題思考

2021-10-07 09:34:20 字數 760 閱讀 7072

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...