c语言 - Atomic if(A && B)?



有没有办法用合相做原子if?也就是说,我可以以某种方式在 C 中原子地测试if(A && B)吗?如果它在第一次结合时短路,那么没问题,但如果它没有,到它检查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。必须注意确保读取的顺序。易失性和/或内存屏障可以帮助执行命令。

所有这些都特定于目标硬件、操作系统和编译器,如果不了解这些细节,就无法详细回答问题。

使用mutexsemaphore来保护A不被更改。

或者你可以试试这个。

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  */
}

相关内容

  • 没有找到相关文章

最新更新