繁体   English   中英

这种std :: atomic_thread_fence的使用是否正确?

[英]Is this use of std::atomic_thread_fence correct?

我想在构造函数中初始化一个字段,然后再也不要更改它。 我希望保证在构造函数完成后,每次读取字段都会读取初始化值,无论读取发生在哪个线程中。

基本上,我想要与Java中的final字段相同的保证。

这是我试过的:

#include <atomic>
#include <iostream>
#include <thread>

struct Foo
{
    Foo(int x) : x(x)
    {
        // ensure all writes are visible to other threads
        std::atomic_thread_fence(std::memory_order_release);
    }

    int x;
};

void print_x(Foo const& foo)
{
    // I don't think I need an aquire fence here, because the object is
    // newly constructed, so there cannot be any stale reads.
    std::cout << foo.x << std::endl;
}

int main()
{
    Foo foo(1);
    std::thread t(print_x, foo);
    t.join();
}
  • 难道这保证始终打印1或可以跟帖t观察foo.x未初始化状态?
  • 如果不是使用成员初始化器x(x)而是使用显式赋值而不是x(x) this->x = x; 用来?
  • 如果x不是int而是某些类类型怎么办?
  • 使xconst int改变线程安全吗?

基本上,如果其他一切都是正确的,那么应该没有任何问题。 在初始化字段之后,在任何线程中访问它之前,您需要某种内存同步; 这很清楚。 否则,其他线程如何知道它是构造的。 如果在启动其他线程之前初始化它,那么创建线程将确保必要的同步。 (这只存在于执行创建的线程和创建的线程之间。其他已经运行的线程不同步。)之后,只要没有线程修改该值,就不需要同步。

关于代码,您不需要fence,因为在创建任何其他线程之前初始化值,并且创建线程可确保必要的同步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM