首頁  >  問答  >  主體

Python内部是如何存储GC引用变量的计数的?

PHP中文网PHP中文网2741 天前502

全部回覆(1)我來回復

  • ringa_lee

    ringa_lee2017-04-18 10:10:49

    這個比較容易理解,GIL保證python byte code在進程內同時只有一個native thread在運
    行。但byte code本身的邏輯仍然需要加鎖/互斥等保證線程可重入,因為byte code運行
    過程中任意點都可能被打斷並切換到另外的線程。

    舉個簡單的例子:
    一段計數器的程式碼:
    // Step 1
    counter = get_counter()
    // Step 2
    counter += 1
    // Step 3
    set_counter(counter)

    假設初始Counter為0,在不做任何同步的情況下兩個執行緒同時執行這段Python程式碼,
    期望結果應該是兩個執行緒都做了計數,最後Counter應該是2:

    但由於沒有加鎖/互斥導致執行情形如下:

    1. 線程A執行完Step1時取得counter為0,這是切換到線程B

    2. 執行緒B順利執行完Step1,2,3,現在Counter為1,然後切換到A

    3. 執行緒A繼續執行完Step2得到counter為1,然後Step3設定Counter為1。

    最終結果為1.

    回覆
    0
  • 取消回覆