2012-09-23 29 views
1

我已經在多線程(在QT)工作,但我缺少深入的瞭解。我認爲運行時不會重複執行代碼。函數將保留在所有調用者或對象將用於調用它的恰好一個內存位置中。在多線程中,我讀到每個線程都有自己的堆棧,指令指針等等。比方說,我們有一個全球性的功能,翻譯成彙編算法是這樣的:爲什麼鎖是沒有必要的本地/堆棧變量在多線程

//GlobalFunction() 
instruction 1 : move value 4 into accumulator 
instruction 2 : add 5 to content of accumulator 
instruction 3 : subtract 1 from content of accumulator 
//some more stuff and function returns 

//thread 1 
call GlobalFunction() 

//thread 2 
call GlobalFunction() 

現在也許線程的指令指針1點到指令3,而線程2獲得切片並執行指令1.此線程後1個執行指令3.不會累加器數據被破壞嗎?如果是這樣,那麼爲什麼僅使用非靜態局部變量的函數不需要在多線程環境中進行鎖定?

P.S:此外,我想一個指令是原子不是一組指令,所以實現可能出不來刷新寄存器中的數據到一些存儲位置執行另一個線程的指令之前的機會。

回答

7

雖然只有一組在CPU上的寄存器(爲簡單起見,我假設單核系統),該系統管理寄存器文件,使得每個線程具有它自己的單獨的寄存器狀態 - 當OS開關從一個線程到另一個線程,第一個線程的寄存器被保存,第二個線程的保存的寄存器被恢復。

對於自動/堆棧變量,每個線程都得到它自己的堆棧,所以除非線程做了一些事情來明確地共享這樣一個變量(通過傳遞地址或引用到另一個線程),那些變量不是共享的,線程也是如此-安全。

+0

完全正確! –

0

沒有,每個線程也有自己的執行寄存器(包括該處理器可能有任何蓄電池)。

在多處理器系統中,每個處理器有它自己的寄存器(這是什麼使得它單獨的處理器核心),並且當多個線程被切換到相同的處理器寄存器狀態被保存&恢復。

2

的OS和CPU處理寄存器和各種CPU狀態。多核CPU具有多個累加器/寄存器 - 每個活動線程一個。在指令中間,單核CPU不能被中斷 - 整個可見的CPU狀態都在寄存器中,這些寄存器由操作系統保存和恢復。