我试图确切地理解重入代码的含义。我有以下代码:

void HWt::startElement(uint8_t HW, uint8_t val)
{
    writeBitsToregister(REG_VAL + HW*131072, 0, 3, val); //Write bits 0-2
    writeBitToregister(REG_VAL, 3, 1);  //Set bit 3 to 1
    writeBitToregister(REG_VAL, 3, 0); //Set bit 3 to 0
}

我必须确保所有位写入都是原子的。有人告诉我这不是可重入的。我可以理解如何使其成为线程安全的,我可以只使用互斥量。

如何使其重入安全?另外,我不明白在这里重入意味着什么?同一线程如何多次访问此函数?仅当在ISR或递归中调用此方法时,才会发生这种情况吗?这些都不是。

最佳答案

可重入的安全性意味着函数可以在执行时成功处理对其自身的“上下文无关”调用。在现代操作系统的非内核代码中,这通常意味着另一个线程将同时调用它,因此在这种情况下,它等同于线程安全。

但是,例如在MS-DOS或内核代码中,函数执行期间随时可能发生中断,并可能自行调用该函数。除非专门编写函数以避免这种情况,否则这可能会产生奇怪的副作用。

另请参阅:http://en.wikipedia.org/wiki/Reentrancy_%28computing%29

09-30 14:12