我为微控制器(http://distortos.org/)编写了一个RTOS,它必须运行 - 其中包括 - ARMv6-M架构 - 它不支持原子操作 - 它没有LDREX
/ STREX
请说明。
我想知道是否有任何聪明的技巧可以让我拥有一个非常简单的无锁共享标志?在清除之前,只能由一个线程测试和设置的东西。这些方面的东西:
bool lockFreeFlag;
void serializedFunction()
{
if (lockFreeFlag == true)
return;
lockFreeFlag = true;
// initialize something
}
void anotherThread()
{
while (1)
{
if (lockFreeFlag == true)
{
// do something
lockFreeFlag = false;
}
}
}
在这个天真的代码中,当多个线程调用serializedFunction()
时,就会出现竞争条件(线程可以在检查之后但在设置标志之前被抢占)。
通过使用两个(或更多)变量或整数或其他东西,它可能以某种方式成为可能吗?我不需要任何同步或等待,检查可能会失败,等等。我只需要允许一个线程进入该函数,直到某些处理完成,在这种情况下,下一次调用此函数将成功。我想避免一些"标准"如果可能的话,锁定形式(在这种情况下,屏蔽中断以禁用抢占)。它不需要成为"标志",我实际上更喜欢它是一个指针,但bool,整数或其他东西也可以。