Tag: 比较和交换

primefaces比较(不等于)和交换

我想使用primefaces比较和交换,但不是等于,我想只在内存位置不等于旧值时进行交换。 在C中有可能吗?

比较和交换如何工作

我已经阅读了一些post,说比较和交换保证primefaces性,但是我仍然无法得到它是怎么回事。 以下是比较和交换的通用伪代码: int CAS(int *ptr,int oldvalue,int newvalue) { int temp = *ptr; if(*ptr == oldvalue) *ptr = newvalue return temp; } 这如何保证primefaces性? 例如,如果我使用它来实现互斥锁, void lock(int *mutex) { while(!CAS(mutex, 0 , 1)); } 这如何防止2个线程同时获取互斥锁? 任何指针都会非常感激。

使用cmpxchg8b获得无符号长度的预期输出

我正在尝试编写一个简单的比较和交换内联汇编代码。 这是我的代码 #include #include #include static inline unsigned long cas(volatile unsigned long* ptr, unsigned long old, unsigned long _new) { unsigned long prev=0; asm volatile(“lock cmpxchg8b %0;” : “=m”(prev) : “m”(*ptr),”a”(old),”c”(_new) ); return prev; } int main() { unsigned long *a; unsigned long b=5,c; a=&b; c=cas(a,b,6); printf(“%lu\n”,c); return 0; } 理想情况下,此代码应打印5但是打印0.我的代码有什么问题?请帮助。

为什么GCC填充这个位域?

程序在C中使用std = c99,这是在64位机器上。 struct epochs { volatile unsigned int epoch : 1; volatile unsigned int pulse : 1; volatile unsigned int active0 : 7; volatile unsigned int active1 : 7; volatile unsigned int counter0 : 24; volatile unsigned int counter1 : 24; }; 当我检查sizeof(epochs)它给了我12。 我可以告诉gcc不要通过添加__attribute((packed))来填充它; 所以我可以解决它。 但是我真的想知道为什么要添加4个字节来填充这个64位结构? 这里的主要内容是这个结构需要64位,因为它在64位primefaces交换操作中一次更新,当然这对12字节值不起作用。

使用CAS以primefaces方式递增两个整数

显然,可以使用比较和交换指令以primefaces方式递增两个整数。 这个谈话声称存在这样的算法,但它没有详细说明它的样子。 如何才能做到这一点? (注意,一个接一个地递增整数的明显解决方案不是primefaces的。另外,将多个整数填充到一个机器字中并不算数,因为它会限制可能的范围。)