取消引用指针是否总是会导致内存访问?
否,例如:
int five() {
int x = 5;
int *ptr = &x;
return *ptr;
}
任何正常的优化编译器都不会从这里的堆栈内存中发出mov
,而是类似以下内容:
five():
mov eax, 5
ret
这是允许的,因为as-if rule.
How do I do inter-thread communication through a bool*
then?
这就是std::atomic<bool>
的用处.
您不应该使用非原子对象在线程之间进行通信,因为同时通过两个线程访问同一内存在C++中是未定义的行为.std::atomic
使其成为线程安全的.
例如:
void thread(std::atomic<bool> &stop_signal) {
while (!stop_signal) {
do_stuff();
}
}
Technically,这并不意味着从stop_signal
开始的每个加载实际上都会发生.允许编译器执行部分循环展开,如下所示:
void thread(std::atomic<bool> &stop_signal) {
// only possible if the compiler knows that do_stuff() doesn't modify stop_signal
while (!stop_signal) {
do_stuff();
do_stuff();
do_stuff();
do_stuff();
}
}
原子load()
被允许观察陈旧的值,因此编译器可以假设四个load()
都将读取相同的值.
只有某些操作,如fetch_add()
,才需要观察最新的值.
即使到那时,这种优化也是可能的.
实际上,这样的优化在任何编译器中都不是针对std::atomic
实现的,因此std::atomic
是准volatile
.这同样适用于C的atomic_bool
,以及一般的_Atomic
类型.
另见: