[英]How can I implement a portable pointer compare and swap?
我在StackOverflow答案中找到了compareAndSwap
代碼:
boolean CompareAndSwapPointer(volatile * void * ptr,
void * new_value,
void * old_value) {
#if defined(_MSC_VER)
if (InterlockedCompareExchange(ptr, new_value, old_value) == old_value) return false;
else return true;
#elif (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100
return __sync_bool_compare_and_swap(ptr, old_value, new_value);
#else
# error No implementation
#endif
}
這是擁有可移植的快速代碼的最正確方法(匯編內聯除外)。
同樣,一個問題是那些特定的builtin
方法具有不同的參數,並且從一個編譯器返回值到另一個編譯器,這可能需要一些其他更改,例如本例中的if then else
。
還有另一個問題是這些builtin
方法在機器代碼級別的行為,它們的行為是否完全相同? (例如,使用相同的組裝說明)
注意:另一個問題是,如果有很多受支持的平台,而不僅僅是本示例中的( Windows
和Linux
)。 代碼可能會變得很大。
我將使用允許通用代碼通用的硬件抽象層 (HAL)-可以包括任何可移植源並為每個平台構建。
我認為,這可以提供更好的結構化和可讀性的來源。
為了讓您更好地了解此過程,我建議Google查找示例和解釋。
希望這個簡短的答案會有所幫助。
[編輯]我將嘗試一個簡單的Bionix示例,以展示如何實現HAL系統...
mrAMainApplication.c包含以下內容...
#include "hal.h"
// This gets called every time around the main loop ...
void mainProcessLoop( void )
{
unsigned char key = 0;
// scan key ...
key = hal_ReadKey();
if ( key != 0 )
{
hal_PrintChar( key );
}
}
然后,他創建一個頭文件(請記住-這是一個示例,而不是工作代碼!)...他創建了hal.h ...
#ifndef _HAL_H_
#define _HAL_H_
unsigned char hal_ReadKey( void );
unsigned char hal_PrintChar( unsigned char pKey );
#endif // _HAL_H_
現在,A先生需要兩個單獨的源文件,一個用於他的“天河2”系統,另一個用於他的Amiga 500。
hal_A500.c
void hal_ReadKey( void )
{
// Amiga related code for reading KEYBOARD
}
void hal_PrintChar( unsigned char pKey )
{
// Amiga related code for printing to a shell...
}
hal_Tianhe2_VERYFAST.c
void hal_ReadKey( void )
{
// Tianhe-2 related code for reading KEYBOARD
}
void hal_PrintChar( unsigned char pKey )
{
// Tianhe-2 related code for printing to a shell...
}
然后,A先生-在為Amiga建造時-生成mrAmainApplication.c和hal_A500.c。在為Tianhe-2建造時-他使用hal_Tianhe2_VERYFAST.c而不是hal_A500.c
正確-我已經用幽默的方式編寫了這個示例,但任何人都沒有注意到,只是我覺得它使示例更加有趣,並希望有助於理解。
尼爾
看一下ConcurrencyKit ,也許您可以使用更高級的原語,這可能是大多數人真正想要的。 與某種程度上特定於操作系統的HAL相比,我相信CK在Windows上以及許多非gcc編譯器上均可工作。
但是,如果您只是對如何在各種C編譯器上移植實現“比較並交換”或原子操作感興趣,請查看該代碼的工作原理。 都是開源的。
我懷疑這些細節可能會變得凌亂,而這些東西通常不會在這里為普通公眾帶來輕松或有趣的展示。
在現代的C,從C11,使用_Atomic
的類型資格和atomic_compare_exchange_weak
的功能。
較新版本的gcc和clang符合C11並以可移植的方式實現這些操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.