我compareAndSwap在StackOverflow答案中找到了这段代码:
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
}
Run Code Online (Sandbox Code Playgroud)
这是使用便携式快速代码的最合适方式(除了程序集内联).
此外,一个问题是这些特定builtin方法具有不同的参数并从一个编译器返回另一个编译器的值,这可能需要一些额外的更改,如if then else本示例中所示.
另一个问题是这些builtin方法在机器代码级别中的行为,它们的行为是否完全相同?(例如使用相同的装配说明)
注意:另一个问题是,如果有许多支持的平台不仅仅是(Windows和Linux)在这个例子中.代码可能会变得非常大.
我将使用硬件抽象层(HAL),它允许通用代码通用 - 并且可以包含任何可移植源并为每个平台构建。
在我看来,这可以提供更好的结构化和更具可读性的源代码。
为了让你更好地理解这个过程,我建议谷歌寻找例子和解释。
希望这个简短的回答有所帮助。
[编辑] 我将尝试为 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 );
}
}
Run Code Online (Sandbox Code Playgroud)
然后他创建一个头文件(记住 - 这是一个示例,不是工作代码!)...他创建 hal.h ...
#ifndef _HAL_H_
#define _HAL_H_
unsigned char hal_ReadKey( void );
unsigned char hal_PrintChar( unsigned char pKey );
#endif // _HAL_H_
Run Code Online (Sandbox Code Playgroud)
现在 A 先生需要两个单独的源文件,一个用于他的“天河二号”系统,另一个用于他的 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...
}
Run Code Online (Sandbox Code Playgroud)
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...
}
Run Code Online (Sandbox Code Playgroud)
然后,A 先生 - 在为 Amiga 构建时 - 构建 mrAmainApplication.c 和 hal_A500.c 在为 Tianhe-2 构建时 - 他使用 hal_Tianhe2_VERYFAST.c 而不是 hal_A500.c
是的 - 我以一些幽默的方式写了这个例子,这并不是针对任何人,只是我觉得它使这个例子更有趣,并希望有助于理解。
尼尔