簡體   English   中英

如何實現可移植指針比較和交換?

[英]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方法在機器代碼級別的行為,它們的行為是否完全相同? (例如,使用相同的組裝說明)

注意:另一個問題是,如果有很多受支持的平台,而不僅僅是本示例中的( WindowsLinux )。 代碼可能會變得很大。

我將使用允許通用代碼通用的硬件抽象層 (HAL)-可以包括任何可移植源並為每個平台構建。

我認為,這可以提供更好的結構化和可讀性的來源。

為了讓您更好地了解此過程,我建議Google查找示例和解釋。

希望這個簡短的答案會有所幫助。

[編輯]我將嘗試一個簡單的Bionix示例,以展示如何實現HAL系統...

  • A先生希望他的應用程序可以在他的“ Tianhe-2”和“ 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 );
   }
}

然后,他創建一個頭文件(請記住-這是一個示例,而不是工作代碼!)...他創建了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM