如何强制检查指针值
How to force check pointer value
我正在编写简单的循环代码,需要检查简单的自定义线程锁,当这个锁被传递时,线程将继续
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。
相关文章:
- C++将一个指针分配给另一个指针时执行的类型检查
- 如何检查类中共享指针的有效性?
- 如何强制检查指针值
- 检查输入 std::array 指针数据是否等于某个常量数组
- 重新检查时指针属性会更改
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 为什么 C 样式字符串的工作空指针检查不?
- 初始化期间针对安全检查的指针的恒定正确性
- 如何检查C++智能指针内存分配是否成功?
- 检查指针是否指向矢量元素
- 通过基类指针检查模板类是否相等
- NULL指针检查线程安全
- 指针检查的性能差异-智能指针
- C++:是经过优化的if()指针检查
- 如何在驱动程序代码中使用零检查无符号字符指针检查
- 开罗上下文的指针检查的好处
- 从多态指针检查类成员是否存在
- 使用此指针检查对象的同一实例
- 簿记与使用指针检查成员变量是否已初始化