我试图准确理解重入代码的含义。我有这段代码:
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中调用或递归时才会发生这种情况吗?这些都不是。
答案 0 :(得分:3)
可重入安全意味着该函数可以在执行时成功处理对其自身的“脱离上下文”调用。在现代操作系统中的非内核代码中,这通常意味着另一个线程将同时调用它,因此在这种情况下它等同于线程安全。
但是,例如在MS-DOS或内核代码中,函数执行时可能会发生中断,可能会自行调用该函数;这可能有奇怪的副作用,除非专门编写该函数以避免这种情况。
另请参阅:http://en.wikipedia.org/wiki/Reentrancy_%28computing%29