【发布时间】:2020-06-22 12:49:52
【问题描述】:
在将单例类重构为线程安全 (fallowing Herb Sutter advice how to write proper double-check locking) 期间,我遇到了我的编译器版本(带有 --std=c++0x 标志的 gcc 4.4.7)支持原子但不支持 nullptr 的问题.
当前代码
class SingletonClass {
public:
SingletonClass* getInstance() {
if (instance == NULL) {
instance == new SingletonClass();
}
return instance;
}
private:
SingletonClass() = default;
~SingletonClass() = default;
static SingletonClass* instance;};
我想要达到的目标
#include <cstdatomic>
#include <mutex>
class SingletonClass {
public:
SingletonClass* getInstance() {
if (instance == NULL) {
std::lock_guard<std::mutex> lock (m);
if(instance == NULL){
instance = new SingletonClass();
}
}
return instance;
}
private:
SingletonClass() = default;
~SingletonClass() = default;
static std::atomic<SingletonClass*> instance;
static std::mutex m;
};
但这给了我一个错误,说没有用于将原子 ptr 与 NULL 进行比较的运算符
main.cpp: In member function ‘SingletonClass* SingletonClass::getInstance()’:
main.cpp:7: error: ambiguous overload for ‘operator==’ in ‘SingletonClass::instance == 0l’
main.cpp:7: note: candidates are: operator==(void*, void*) <built-in>
main.cpp:7: note: operator==(SingletonClass*, SingletonClass*) <built-in>
由于我无法将实例 ptr 与 NULL 或使用 nullptr 进行比较,我该如何解决它并检查它是否已初始化?
【问题讨论】:
-
工具链依赖是一回事,但可以肯定的是,你能确认你被 4.4.7 卡住了吗?
-
是的,那是我无能为力的东西
-
如果你将
NULL明确地转换为void*或SingletonClass*会发生什么,比如if(instance == dynamic_cast<SingletonClass*>(NULL)) -
错误:不能 dynamic_cast ‘0l’(‘long int’类型)到类型‘class SingletonClass*’(源不是指针)
-
错误:不能将'0l'('long int'类型)动态转换为'void*'类型(源不是指针)