跨平台原子操作
来源:互联网 发布:三星s4可以用4g网络吗 编辑:程序博客网 时间:2024/04/30 15:53
{
public:
AtomicRefCount();
int increment();
int decrement();
void reset();
private:
AtomicRefCount& operator=( const AtomicRefCount& );volatile int m_count;
Mutex m_lock;
};
#include "atomicrefcount.h"
#if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
# include <windows.h>
#elif defined( __APPLE__ )
# include <libkern/OSAtomic.h>
#elif defined( HAVE_GCC_ATOMIC_BUILTINS )
// Use intrinsic functions - no #include required.
#else
# include "mutexguard.h"
#endif
#ifdef _WIN32_WCE
# include <winbase.h>
#endif
AtomicRefCount::AtomicRefCount()
: m_count( 0 )
{
}
int AtomicRefCount::increment()
{
#if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
return (int) ::InterlockedIncrement( (volatile LONG*)&m_count );
#elif defined( __APPLE__ )
return (int) OSAtomicIncrement32Barrier( (volatile int32_t*)&m_count );
#elif defined( HAVE_GCC_ATOMIC_BUILTINS )
// Use the gcc intrinsic for atomic increment if supported.
return (int) __sync_add_and_fetch( &m_count, 1 );
#else
// Fallback to using a lock
MutexGuard m( m_lock );
return ++m_count;
#endif
}
int AtomicRefCount::decrement()
{
#if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
return (int) ::InterlockedDecrement( (volatile LONG*)&m_count );
#elif defined( __APPLE__ )
return (int) OSAtomicDecrement32Barrier( (volatile int32_t*)&m_count );
#elif defined( HAVE_GCC_ATOMIC_BUILTINS )
// Use the gcc intrinsic for atomic decrement if supported.
return (int) __sync_sub_and_fetch( &m_count, 1 );
#else
// Fallback to using a lock
MutexGuard m( m_lock );
return --m_count;
#endif
}
void AtomicRefCount::reset()
{
#if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
::InterlockedExchange( (volatile LONG*)&m_count, (volatile LONG)0 );
#elif defined( __APPLE__ )
OSAtomicAnd32Barrier( (int32_t)0, (volatile int32_t*)&m_count );
#elif defined( HAVE_GCC_ATOMIC_BUILTINS )
// Use the gcc intrinsic for atomic decrement if supported.
__sync_fetch_and_and( &m_count, 0 );
#else
// Fallback to using a lock
MutexGuard m( m_lock );
m_count = 0;
#endif
}
- 跨平台原子操作
- x86平台原子操作原理
- 平台无关的高效原子操作:ACE_Atomic_Op
- 跨平台的原子操作及简单的循环锁实现
- x86平台原子操作API的实现原理
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 本地读取Json失败
- mysql关联查询怎么在查询软件中一下就能查询到所有的关联数据,修改的时候也方便,对比数据
- LINUX 删除 matlab
- Sum of Left Leaves
- 线性表数据结构解读(一)顺序存储结构ArrayList
- 跨平台原子操作
- 使用OrmLite数据库实现本地的账号登录,注册功能
- Scala Cookbook读书笔记 Chapter 4.Classes and Properties 第一部分
- MITA和MAUI框架
- phpstorm安装
- Qt之QTcpServer/QTcpSocket简单收发信息(1)
- js实现网页全屏切换(平滑过渡),鼠标滚动切换
- [Leetcode] Palindrome Partitioning
- 【php】数组 取某一列的值 array_column