執行緒這個概念早在多核cpu出現之前就提出來了,單核時代的多執行緒主要是為了讓cpu盡量不處於空閒狀態,使其計算能力始終能得到利用。但本質上講,在任意時刻只有乙個執行緒在執行。
儘管任意時刻只有乙個執行緒在執行,但是依然有些問題需要解決,其中最重要的就是執行緒安全。這個問題的**很簡單,我之前說過,cpu對指令是一條一條執行的,不過要注意的是,高階語言中的一行**在組合語言層面上,可能由多條彙編指令組成的。舉乙個簡單的例子,在c語言中對某個變數做自增操作:
int a = 0
;int add()
不過變成彙編指令就不這麼簡單了,其中實現自增的主要是這兩條指令(大部分指令省略):
movl a(%rip), %eax
addl $1, %eax
這裡之所以在例子中使用全域性變數,是因為執行緒安全和資料同步主要是針對全域性變數這類可以共享的資源。上面的a(%rip)表示全域性變數a的值,%eax是乙個暫存器。第一條指令表示把a的值儲存在eax暫存器中,第二條指令對eax中的值加上1。
我們來考慮乙個情況:現在有兩個執行緒a,b,都要呼叫add()函式,那麼a的預期值應該是2。如果執行緒a執行完第一條指令後,發生了上下文切換,此時eax暫存器的值是a的初始值0,cpu去執行執行緒b,執行緒b執行完畢後,把1返回給a(%rip),再恢復執行執行緒a,由於執行緒a不會再去執行第一條指令,因此eax暫存器的值不會被更新,依舊是0,執行緒a執行完畢後,把1返回給a(%rip)。最終,a(%rip)的值是1而不是2。
上面這種情況就是我們常說的資料不同步,或者執行緒不安全。對此,人們提出了很多方法,比如原子操作,互斥鎖等等,出發點主要是以下兩種:
1. 保證操作不被執行緒排程機制打斷,要麼全部完成,要麼全部不做;
2. 即使操作被執行緒排程機制打斷,別的執行緒也無法獲得相關資源的使用權。
python2執行緒 python多執行緒2執行緒應用
上 1 經典的生產者,消費者問題 2 lock和rlock差不多 lock會死鎖,rlock不會,具體google coding gbk created on 2013 1 4 author jimmy note 1 乙個簡單的建立執行緒例子,外加生產者消費者問題 2 執行緒同步初步 import ...
python2 執行緒基礎
執行緒基礎 匯入,建立函式,建立線和執行 import thread import time 為執行緒定義乙個函式 defprint time threadname,delay count 0 while count 5 time.sleep delay count 1 print s s thre...
python多執行緒 Python多執行緒的一些知識
了更好地體驗多執行緒爬蟲,本章先介紹下需要了解的知識點,以便後續的多執行緒爬蟲文章有更好的理解與學習。在接下來要講的知識點中,感興趣的讀者們請先弄清楚程序和執行緒兩者是什麼?它們各自有著什麼樣的關係呢?讀下廖雪峰老師簡單介紹的例子,比喻非常生動清晰,故這裡不多做講解。程序和執行緒 www.liaox...