试图创建CAS模板

时间:2010-11-29 08:46:44

标签: c++ templates compare-and-swap

目前我忙着摆弄CAS操作和锁定/等待算法,为了我自己的理智,我决定实施一个模板来处理所有的演员:

VC6:

template <typename T> static inline T CAS(volatile T* pDest, T pCompare, T pValue)
{
    //static_assert(sizeof(T) != sizeof(PVOID),"CAS requires PVOID sized operands");
    return reinterpret_cast<T>(InterlockedCompareExchange(reinterpret_cast<PVOID*>(pDest),reinterpret_cast<PVOID>(pValue),reinterpret_cast<PVOID>(pCompare)));
}

GCC 4.4.1:

template <typename T> static inline T CAS(volatile T* pDest, T pCompare, T pValue)
{
    static_assert(sizeof(T) != sizeof(long),"CAS32 requires long sized operands");
    return reinterpret_cast<T>(InterlockedCompareExchangePointer(reinterpret_cast<volatile long*>(pDest),reinterpret_cast<long>(pValue),reinterpret_cast<long>(pCompare)));
}

但是,使用一些简单的测试代码,我无法在volatile目标上工作,这是防止重新排序所必需的。

测试代码:

volatile int* p;
int i = 2;
int* pi = &i;
CAS(&p,NULL,pi);

在VC6下我收到此错误:

error C2782: 'T __cdecl CAS(volatile T *,T,T)' : template parameter 'T' is ambiguous
        could be 'int'
        or       'volatile int *'

和海湾合作委员会吐出这个:

error: no matching function for call to 'CAS(volatile int**, NULL, int*&)'

是否有可能获得CAS操作的模板,该模板在目的地为volatile时不会中断,或者我是否坚持使用宏?

1 个答案:

答案 0 :(得分:1)

如果我按如下方式调用CAS函数,那就OK:

CAS<int*>( &p, NULL, pi );

然后我得到一个不同的错误:

error C2664: 'CAS' : cannot convert parameter 1 from 'volatile int **' to 'int *volatile *'

这给出了更多关于出错的线索。

解决问题的一种方法是引入一个typedef,如下所示:

    typedef int* pint_t;

volatile pint_t p;
int i = 2;
pint_t pi = &i;
CAS<pint_t>( &p, NULL, pi );