如何强制检查指针值

How to force check pointer value

本文关键字:指针 检查 何强制      更新时间:2023-10-16

我正在编写简单的循环代码,需要检查简单的自定义线程锁,当这个锁被传递时,线程将继续

static bool* lock;
...
while (*lock);
// TODO: process to the next step
...

但是当我检查编译的程序集时,我看到下一个代码

static bool* lock;
...
bool lock_value = *lock;
while (lock_value);
// TODO: process to the next step
...

这意味着在最初的情况下,线程将卡在检查周期*lock == false;

问题。假设这不是螺纹锁,而是其他东西:颜色,价格等。那么我如何强制检查此指针值。当然,我可以通过内联组装来处理这个问题

__asm {
lbl_back:
mov ecx, lock
mov eax, [ecx]
test eax, eax
jnz lbl_back
}

但是我怎么能通过C/C++拥有,没有std和没有外部的东西来做到这一点呢?只需清除 C/C++ 语言语法

谢谢大家。volatile是我的选择

简短的回答:没有副作用的无限循环是未定义的行为。这使得你的代码在形式上毫无意义,编译器可以自由地假设未定义的行为永远不会发生。由于while (*lock);只是简单地读取标量并且不会引起副作用,因此这会导致 UB,因此编译器继续执行它想要的操作。在没有额外安全预防措施的情况下,让多个线程读取和写入相同的内存位置也是未定义的行为,我认为这就是您在其余代码中所做的。

长答案:这个"简单的自定义线程锁"不起作用。这个想法几乎是正确的,但要真正防止竞争条件,你需要的不仅仅是简单的布尔值。您应该研究同步原语,如 std::atomic、std::mutex、std::lock_guard、std::condition_variable、信号量或更高级别的异步工具,如 std::future。