如何实现便携式指针比较和交换?

Bio*_*441 8 c intrinsics

compareAndSwapStackOverflow答案中找到了这段代码:

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方法在机器代码级别中的行为,它们的行为是否完全相同?(例如使用相同的装配说明)

注意:另一个问题是,如果有许多支持的平台不仅仅是(WindowsLinux)在这个例子中.代码可能会变得非常大.

Nei*_*eil 3

我将使用硬件抽象层(HAL),它允许通用代码通用 - 并且可以包含任何可移植源并为每个平台构建。

在我看来,这可以提供更好的结构化和更具可读性的源代码。

为了让你更好地理解这个过程,我建议谷歌寻找例子和解释。

希望这个简短的回答有所帮助。

[编辑] 我将尝试为 Bionix 尝试一个简单的示例,以展示如何实现 HAL 系统......

  • A 先生希望他的应用程序能够在他的“天河二号”和“Amiga 500”上运行。他拥有交叉编译器等,并将在他的 PC 上构建两个二进制文件。他想读取按键并打印到屏幕上。

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

是的 - 我以一些幽默的方式写了这个例子,这并不是针对任何人,只是我觉得它使这个例子更有趣,并希望有助于理解。

尼尔