便携式比较和交换(原子操作)C/C++图书馆?
-
18-09-2019 - |
题
是否有任何小型图书馆,这wrapps各种处理器'CA-就像操作纳入宏或职能,这是便携式的跨多个编译器?
PS。 的 原子的。hpp库 是内部提升::进程::详细名字空间。提交人拒绝让公众,以及维持图书馆。
让我们重新打开这个问题,看看是否有任何其他选择吗?
解决方案
英特尔线程构建模块有一个很好的便携atomic<T>
模板,你想要做什么。但无论是小库或不当然可辩论..
其他提示
OPA(开的便携式原子)可能是一个很好适合你的需要。 https://trac.mcs.anl.gov/projects/openpa/
它提供了一个一致C API共同原子操作跨越多个平台的下一个麻省理工学院风格的许可证。图书馆是小肯定符合你的尺寸要求。目前的平台,名单为:
- 海湾合作委员会内联会x86、x86_64,ia64,PPC440,并MIPS5K处理器。几个编译器与海湾合作委员会兼容上下的前端也支持在同样的架构,例如国际刑事法院,PGI和IBM的xlc.
- 海湾合作委员会的原子内部函数,因此大多数海湾合作委员会-4.1+设施的支持。
- SUN Solaris原子操作的图书馆。
- Windows NT内部函数(虽然目前需要做一点小小的额外工作建立在Windows)。
- 两个伪平台,pthread互斥基于模拟携带来否则不支持平台(同时牺牲了一些性能的),和一个"不安全"的执行情况中使用的代码,是有条件的编制是单线的代码。
我从来没有使用过它在C++程序,虽然它应该与工作很少或没有变化。我很乐意调整它如果你遇到的麻烦(只是邮件opa-discuss@lists.mcs.anl.gov).
在升压进程间库可能是你所追求的 - 在Atomic.hpp包括文件包含了比较并交换实现为各种平台和编译器
您可能会感兴趣的油嘴的原子操作功能,
g_atomic_int_compare_and_exchange()
实施用于各种架构的CAS语义。 实施本身是比较容易理解,可以独立使用,无需太多精力,你可以在svn.gnome.org/viewvc/下油嘴/主干/油嘴/ gatomic找到它。{C,H}。希望这有助于!
在Mac OS X和Windows有内置的比较并交换功能,您应该使用反正(InterlockedCompareExchange()和OSAtomicCompareAndSwapPtrBarrier(分别))。不管在这些平台上的编译器将因此工作。
在其他Unix系统实在是有点棘手,如果你正在使用GCC 4.1或更高版本,你可以只使用其内置__sync_val_compare_and_swap(),以及许多虽然不是所有的UNIX编译器的支持,因为原在Linux上呈现了大量的代码合理GCC的扩展它们是存在的。
所以,如果你想包装起来的,随着对OS X和Windows的所有处理器最重要的编译器的工作方式,并与海湾合作委员会和你应该做的事情像其他平台的一些其他的编译器:
boolean CompareAndSwapPointer(volatile * void * ptr,
void * new_value,
void * old_value) {
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050
return OSAtomicCompareAndSwapPtr (old_value, new_value, ptr);
#elif defined(_MSC_VER)
return InterlockedCompareExchange(ptr, new_value, old_value);
#elif (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100
return __sync_val_compare_and_swap(ptr, old_value, new_value);
#else
# error No implementation
#endif
}
这是没有测试,但我认为这应该是正确的。注意所有的OS库如何采取ARGS以不同的顺序; - )
很明显,你可以做不同大小的几个版本的比较和掉期和包装他们的模板,如果你想。这些API大多是基于C和编码类型的信息到所述功能以这样一种方式,它是用于排序用于通过模板参数化类型人的讨厌的。
有是 atomic_ops而通过波姆项目的库。不知道关于许可证,虽然。
有一个提议C++0x兼容提高原子图书馆: http://www.chaoticmind.net/~六氯代苯/项目/提高。原子/
这是图书馆 提供一个执行原子 作为提高基础上的 界定C++0x草案 标准。它的目的是使 过渡到std::原子容易的,因为 及提供一种手段,使代码 使用这C++0x特征可编译上 旧的系统。
这显然不是部分的提升,但你可以检查出来的审查线在这里: http://lists.boost.org/Archives/boost/2009/12/160195.php
提升。原子现在是在一种形式,我 考虑要求其释放。它已 支持"真实"原子变量 上:
- 海湾合作委员会/x86,32位(测试在Linux上,FreeBSD)
- 海湾合作委员会/x86,64位(测试Linux)
- 海湾合作委员会/powerpc32(测试在Linux上,Mac OS X)
- 海湾合作委员会/powerpc64(未经测试)
- 一般Win32(试用Visual Studio速赢XP)
对于所有其他落后 优雅地锁定的操作。还有 是正确的quickbook文件, 包括希望说明 例部分。
对笔者说什么(在你提供的链接)是“我认为,直到一些官方Boost库降临时,你可以放心地使用它们”。推迟所述接口改变,直到“当原子功能将要存在于C ++ 0X”。
不管你今天使用的,你可能会想迁移到新的std::
功能时,它的可用反正。
在推动东西一般是相当不错的,看起来像是在发布Boost库的实现中使用。我也一直在尝试使用该实现的几十倍。
我去了。
您还可以看看libsync灵感来自 http://www.ioremap.net/node/ 224 ,这是相当新的(也许是太新的),但它在Elliptics网络中使用,以便它得到的(一些?)测试。
这也为您提供了更高级别的原语旁边CAS:线程间的无锁同步RCU(读取复制更新)
不过,这取决于你的意思是 '便携' 是什么:它支持archtectures x86和PPC,操作系统的Linux,FreeBSD的,OpenBSD系统,Solaris和MacOSX的,但是......没有Windows
和许可证是GPL,你可以恨或爱。