从C ++中的另一个线程读取指针

伯纳德

在下面的代码中,x由于原子线程的限制,线程2中的值始终为10。

int x;
atomic<bool> b(false);

// thread 1:
x = 10;
atomic_thread_fence(memory_order_release);
b = true;

// thread 2:
while(!b){}
atomic_thread_fence(memory_order_acquire);
assert(x == 10); // x will always be 10

但是在下面的代码中,*x线程2中的值始终为10吗?

int* x = new int;
atomic<bool> b(false);

// thread 1:
*x = 10;
atomic_thread_fence(memory_order_release);
b = true;

// thread 2:
while(!b){}
atomic_thread_fence(memory_order_acquire);
assert(*x == 10); // will *x always be 10?
马克西姆·埃格鲁什金

在这两种情况下10,无论是直接完成还是通过指针完成存储,这里都没有区别。

在这里,您不需要内存围栏,因为b = true本质上是b.store(true, std::memory_order_seq_cst)-带围栏的获取释放。

这样的内存顺序可防止编译器对操作周围的存储和加载进行重新排序,并使该存储变为可见时,其他线程可以看到前面的存储。

如果比较这两个函数的生成代码:

#include <atomic>

int x;
std::atomic<bool> b(false);

void f() {
    x = 10;
    std::atomic_thread_fence(std::memory_order_release);
    b = true;
}

void g() {
    x = 10;
    b = true;
}

它是相同的:

f():
        movl    $10, x(%rip)
        movb    $1, b(%rip)
        mfence
        ret
g():
        movl    $10, x(%rip)
        movb    $1, b(%rip)
        mfence
        ret

但是,在您的特定情况下,在我看来,您只需要std::memory_order_release存储b即可使该存储x对其他线程也可见,因此不必使用防护。b.store(true, std::memory_order_release)在这里就足够了。消费者代码需要这样做b.load(std::memory_order_acquire)

标准互斥锁确实会在锁定时获取内存顺序,并在解锁时释放内存顺序(这是获取/释放术语的位置),因此不涉及任何限制。

很少需要显式的防护,主要是在硬件驱动程序中。在用户空间模式下,由于对C ++ 11内存模型的误解,经常会放置代码围栏。栅栏是最昂贵的原子同步机制,这是避免使用栅栏的主要原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从C ++代码中的另一个线程读取的性能影响

从C ++ 11中的另一个线程解锁一个线程

C ++:如何在一个线程中读取二进制文件并将其写入另一个线程中?

如何从C#中的另一个线程在主线程中设置变量?

引用函数中另一个指针的C指针

C#/ WPF从另一个类中创建的另一个线程更新UI

增加一个整数指针并将增加的指针的值赋给 C++ 中的另一个变量

C ++如果有一个线程写完就切换一个布尔值,那么在另一个线程中以循环读取该布尔值是否安全?

传递c ++对象作为指针,以在Rcpp中的另一个函数中重用

在 C 中的另一个函数中填充指向函数的指针数组

C 指针不等于另一个

C指向另一个变量的指针

制作指向另一个 C 程序的指针

如何在QT c ++的另一个线程中更新progressBar中的值

C ++:在程序中创建一个指针,然后在另一个程序中访问该位置

c# - 在另一个线程上运行

如何从另一个文件访问c代码中嵌套结构的指针成员

将数据写入C中另一个程序的指针吗?

C++ 指向另一个类中不同类的指针

C ++线程:如何使用lambda函数将主线程中的参数传递给另一个线程

如何在C ++中将指向一个类的指针复制到另一个类中?

在Unity / C#中,.Net的async / await是否确实从另一个线程开始?

我如何从C ++中的静态线程入口点函数调用另一个函数?

C#-如何从另一个类中的线程更新主UI

C#读取另一个进程内存

在C ++中,如何让一个pthread继续而另一个线程正在等待信号量?

c#设置/从另一个线程/从另一个线程获取控件的属性

将函数指针强制转换为C中的另一个函数指针是否安全?

我在将指针复制到 C++ 中的另一个指针时遇到问题