日期:2014-05-16  浏览次数:20623 次

新手求教LINUX下的原子操作该怎么写
在WINDOWS下这么写:
C/C++ code

        const long tId = GetCurrentThreadId();//获取当前线程ID
                  volatile long m_lThreadId;//之前保存的线程ID
        if (_InterlockedCompareExchange(&m_lThreadId, tId, 0) == 0)
                   {
                       //操作
                    }




在LINUX下,该怎么实现这个原子操作,让线程一个一个来执行????
//注意,是原子操作,不是内核锁哦

------解决方案--------------------
pthread_mutex_lock 如何?
------解决方案--------------------
内核一般都用gcc的嵌入汇编格式搞成lock前缀的汇编指令了,
用户级的,也可以一样用,但一般的多线程库里面有。

想intel的 tbb 库那些应该也有吧。

我自己用的是boost 库里面的找的一个,他封装成_InterlockedCompareExchange 这样的形式了,在boost的 interprocess的detail里面,他们封装了跨平台的接口了,不过好像好几个boost库里面都有自己的实现。

gcc内部好像也有支持 看看这里http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html

另外 c++ 11 标准里面也新加有 atomic类型了,但不知道有编译器支持不。 网上有人搞了个 boost atomic的库,但好像还没被收入boost ,也可以参考一下吧。

我觉得要求一般的话,像我那样直接用boost interprocess的detail里面的就好了,但如果你不用boost可能就不是很方便,包装也一下gcc的 build-in 的函数来用也是可以的吧。文档支持很多平台
------解决方案--------------------
看看
/usr/include/c++/4.6.1/atomic
4.6.1这个版本可能有不同。