if
有没有办法用连词制作原子?也就是说,我可以以某种方式if(A && B)
在 C 中进行原子测试吗?如果它在第一个合相中短路,那没问题,但如果没有,到它检查的时候B
,A
可能已经改变了。有任何想法吗?
编辑:不使用粗锁或信号量。
if
有没有办法用连词制作原子?也就是说,我可以以某种方式if(A && B)
在 C 中进行原子测试吗?如果它在第一个合相中短路,那没问题,但如果没有,到它检查的时候B
,A
可能已经改变了。有任何想法吗?
编辑:不使用粗锁或信号量。
您必须手动同步对这两个对象的访问!你还想怎么做?
这是并行编程的基本思想,一次可以发生两件事,除非你自己做。
伪代码示例:
//Comparison:
{
lock(Amutex);
lock(Bmutex);
bool result = A && B;
unlock(Amutex);
unlock(Bmutex);
if (result) // ...
}
//assignment:
{
lock(Amutex);
A = val;
unlock(Amutex);
}
如果在检查 B 之前绝对不能更改 A,则可以按照建议在 A 上使用锁/互斥锁(或其他一些同步原语,例如关键部分)。
您还可以将 A 和 B 连接成一个对齐的 32 位或 64 位整数,您总是可以原子地作为一个整体进行读取和写入,再次使用同步原语或 CAS 或特殊 CPU 指令,正如建议的那样。
如果您的系统是单处理器的,您还可以在读写 A 和 B 时禁止所有中断或调度,以达到相同的效果。如果 A 或 B 可以由不同的 CPU 修改,这将不适用于多处理器系统。
如果您可以容忍 A 的变化,并且只对在读取 B 之后和读取 B 之前看到相同的 A 值感兴趣,那么您可以读取 A 两次,然后再读取 B。必须注意确保读取的顺序。volatiles 和/或内存屏障可以帮助执行命令。
所有这些都是特定于目标硬件、操作系统和编译器的,如果不了解这些细节,就无法详细回答这个问题。
Use a mutex
or a semaphore
to protect A
from changing.
Or you could try this.
bool A_initial;
if( (A_initial = A) && B && (A==A_initial) ) { /*A has not changed and
condition evaluated to true. */
}
else if (A ! = A_initial){ /* You have to redo the if() or
whatever if A is changed */
}