C++ 正在尝试创建CAS模板
目前我正忙于处理CAS操作和无锁/无等待算法,为了我自己的理智,我决定实现一个模板来为我处理所有的转换: VC6: 在VC6下,我得到以下错误:C++ 正在尝试创建CAS模板,c++,templates,compare-and-swap,C++,Templates,Compare And Swap,目前我正忙于处理CAS操作和无锁/无等待算法,为了我自己的理智,我决定实现一个模板来为我处理所有的转换: VC6: 在VC6下,我得到以下错误: error C2782: 'T __cdecl CAS(volatile T *,T,T)' : template parameter 'T' is ambiguous could be 'int' or 'volatile int *' GCC提出了以下观点: error: no matching fun
error C2782: 'T __cdecl CAS(volatile T *,T,T)' : template parameter 'T' is ambiguous
could be 'int'
or 'volatile int *'
GCC提出了以下观点:
error: no matching function for call to 'CAS(volatile int**, NULL, int*&)'
是否可以为CAS ops获取一个模板,该模板在目标不稳定时不会中断?或者我被宏卡住了?如果我按如下方式调用CAS函数,则可以:
CAS<int*>( &p, NULL, pi );
typedef int* pint_t;
volatile pint_t p;
int i = 2;
pint_t pi = &i;
CAS<pint_t>( &p, NULL, pi );
这提供了更多的线索,以了解到底出了什么问题
解决此问题的一种方法是引入typedef,如下所示:
CAS<int*>( &p, NULL, pi );
typedef int* pint_t;
volatile pint_t p;
int i = 2;
pint_t pi = &i;
CAS<pint_t>( &p, NULL, pi );
typedef int*品脱;
挥发性品脱;
int i=2;
品脱皮=&i;
CAS(&p,NULL,pi);
静态断言
?您使用的是C++0x吗?@KennyTM:对于GCC构建,是的,在VC下,我有一个宏要映射到无效的数组索引。它没有标记为C++0x,因为我试图避免C++0x构造,除了那些可以用宏模拟的构造。interloctedcompareexchange
或interloctedcompareexchangepointer
。您不应该混合使用它们。@J-16 SDiZ:VC6没有InterlocatedCompareExchange指针
,因此它的InterlocatedCompareExchange
的定义是InterlocatedCompareExchange指针
。然而,这确实在我的GCC代码中带来了一个(半)bug,应该是强制转换到PVOID
…从技术上讲,NULL
应该是(void*)0
,但是将NULL
转换到int*
没有任何区别,GCC仍然会抛出:错误:调用'CAS时没有匹配的函数(volatile int**,int*,int*&)“
@Necrolis:重新写下我的答案:)另一种正确定义指针的方法是int*p
做了一些测试,效果很好,只有p
需要为pint\t
类型,这是一个棘手的问题,但是,由于它所做的工作比它所解决的要多,似乎我还是要使用宏:|
error C2664: 'CAS' : cannot convert parameter 1 from 'volatile int **' to 'int *volatile *'
typedef int* pint_t;
volatile pint_t p;
int i = 2;
pint_t pi = &i;
CAS<pint_t>( &p, NULL, pi );