【发布时间】:2026-02-12 09:50:01
【问题描述】:
只想知道atomic_flag = 1; 是否保持 myclass_st 分配线程安全。 (不好意思我的例子有这么多问题,所以改了。)
myClass* myclass_st = nullptr;
std::atomic<int> atomic_flag;
std::mutex mtx; //err
myClass* get_instance() {
//std::unique_lock<std::mutex> lk(mtx);
if (myclass_st == nullptr) {
mtx.lock();
if (myclass_st == nullptr) {
myclass_st = new myClass();
atomic_flag = 1;
mtx.unlock(); //err
}
}
return myclass_st;
}
我知道我们可以在 c11 之后使用static 。
也许我应该像这样修改代码?
myClass* myclass_st = nullptr;
std::atomic<int> atomic_flag;
myClass* get_instance() {
if (atomic_flag.load() == 0) {
std::unique_guard<std::mutex> lk(mtx);
if (atomic_flag.load() == 0) {
myclass_st = new myClass();
atomic_flag = 1;
}
}
return myclass_st;
}
【问题讨论】:
-
在 unique_lock 之后,互斥锁已经被锁定。您的显式锁定和解锁不一致。
-
unique_lock更好,因为一旦抛出异常或超出范围,unique_lock将展开并解锁线程。但是std::mutex不是。 -
互斥锁对线程安全没有任何作用,每次调用
get_instance都会生成一个新的mtx,所以它不会同步任何东西。另外,如果从未检查过,为什么还要使用原子标志? -
您正在检查非原子
myclass_st,而另一个线程(已锁定互斥锁)可以修改它。你需要检查atomic_flag。 -
您为什么认为
atomic_flag = 1会使myclass_st分配线程安全?
标签: c++