2010-11-17 21 views

回答

3

野兔您對自己在IA32 86一個簡單的實現測試&一套

//eax = pointer on 32 bit lock variable 
//Variable must be 4 byte aligned 
//edx = bit test and set number from 0..31 
lock bts  dword ptr [eax], edx 
     setnc al   //al is 1 if bts instruction was successful 

野兔你有一個簡單的實現迴路測試&設置

//eax = pointer on 32 bit lock variable 
//Variable must be 4 byte aligned 
//edx = bit test and set number from 0..31 
@wait: 
     pause     //CPU hint for waiting in loop 
lock bts  dword ptr [eax], edx 
     jc  @wait   //waiting in loop!!! 

還記得wai在循環中會凍結應用程序線程,所以它也很明智,也可以阻止最大等待循環時間。

+1

+1,特別是使用「PAUSE」 – Necrolis 2010-11-22 13:58:33

1

根據體系結構,您可以在單個指令中執行此操作,也可以禁用中斷。

80386和更高版本的兼容體系結構有bts指令,該指令將對進位標誌中的測試結果進行原子測試和設置。 Here是如何使用PPC指令來實現互斥體的一個很好的解釋。

其他要求是這樣的:

cli   ;; Clear interrupts flag. 
move r0, r1 ;; Copy the value into r0. 
ori r1, 1 ;; Set the bit in r1 (r1 holds the value to test-and-set.) 
sti   ;; Re-enable interrupts. 
+0

感謝您的代碼和鏈接。但是沒有找到有用的彙編代碼用於兩者。包含鎖的兩個實現的彙編代碼的任何其他鏈接? – johnshaddad 2010-11-17 23:16:02

+2

我不認爲這個答案是非常有用的。除非您正在編寫自己的操作系統,否則'cli'和'sti'不可用,即便如此,它們也不會幫助您在多個cpus/cores之間實現同步。你需要使用鎖前綴而不是復活80年代和90年代不斷的系統崩潰的原因...... – 2010-11-17 23:50:19

+0

@R:我只有在編寫自己的操作系統時才需要實現這些類型的事情,核心嵌入式芯片。當使用現代處理器時,我使用具有諸如'HAL_TAS_SET'之類的現代操作系統。 – nmichaels 2010-11-18 00:07:24