小编Dyl*_*ier的帖子

即使我已经使用 std::mutex 来保护访问,从技术上讲是否需要 std::atomic ?

从技术上来说,似乎需要std::atomic根据标准保护多个线程读取/写入的所有数据,但对于复杂数据初始化的情况来说,这似乎很奇怪。对于 C++ 内存模型,以下未定义行为或使用锁是否可以解决问题?

class Foo {
public:
    int x;
    int y;

    static Foo* GetFoo();

private:
    static std::mutex sm_lock;
    static Foo* sm_foo;
};

std::mutex Foo::sm_lock;
Foo* sm_foo = nullptr;

Foo* Foo::GetFoo() {
    std::lock_guard<std::mutex> guard(sm_lock);
    if (!sm_foo) {
        sm_foo = new Foo();
        if (sm_foo) {
            sm_foo->x = 42;
            sm_foo->y = 11;
        }
    }

    return sm_foo;
}
Run Code Online (Sandbox Code Playgroud)

我知道在实践中这几乎总是适用于 x86_64,但是内存排序较弱的平台又如何呢?

c++ multithreading atomic thread-safety

3
推荐指数
1
解决办法
117
查看次数

如何获取 Racket 中当前文件的运行时路径?

假设我有一个名为“test.rkt”的文件,我希望其绝对路径在运行时可用。我知道最好的方法是使用以下方式绑定它:

(define-runtime-path orig-file "test.rkt")
Run Code Online (Sandbox Code Playgroud)

但是,出于反射目的,我希望能够在不知道当前文件的名称的情况下执行此操作。例如,我希望能够执行以下操作:

(define-runtime-path-self orig-file)
Run Code Online (Sandbox Code Playgroud)

racket

2
推荐指数
1
解决办法
276
查看次数

标签 统计

atomic ×1

c++ ×1

multithreading ×1

racket ×1

thread-safety ×1