从技术上来说,似乎需要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,但是内存排序较弱的平台又如何呢?
假设我有一个名为“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)