2014-01-29 65 views
2

如何使用boost :: atomic <>模板,以便獲得真正的128位(16字節)CAS,加載和存儲? 問題是,即使強硬的提升1.55.0原子庫表示它現在有128位支持我只能得到假spinlock模擬實現。例如。下面的代碼將失敗:Boost原子128位原子類型x86_64

struct ui128_t { uint64_t low, high; }; 
boost::atomic<ui128_t> atom; 
assert(atom.is_lock_free()); 

我檢查其設置爲false,由於某種原因,我不知道BOOST_ATOMIC_INT128_LOCK_FREE宏。我正在使用MSVC 2012 x64編譯器。

+0

我不認爲你可以做一個128位原子操作,你可以把然而鎖它,直到它的完成後,使用該平臺實際支持的原子類型。 – dtech

+0

由於缺乏更好的想法,您可以嘗試使用像_m128這樣的內建類型(SSE指令的類型)。 – 2014-01-29 14:03:27

+0

x86_64有'lock cmpxchg16b [ptr]'指令,它是原子的。 MSVC支持或至少應該支持通過_InterlockedCompareExchange128 – JATothrim

回答

2

此功能尚未實際發佈:它似乎只在「主幹」中。

您可以使用命令行

grep -R BOOST_ATOMIC_INT128_LOCK_FREE boost/ 

找出哪些編譯器支持它

+0

太糟糕了,它似乎只在gcc上實現.. – JATothrim