【发布时间】:2011-02-13 14:53:26
【问题描述】:
我编写了以下代码来创建我的接口管理器的单例实例。
#include <intrin.h>
#pragma intrinsic(_ReadWriteBarrier)
boost::mutex global_interface_manager_creation_mutex;
interface_manager* global_interface_manager = NULL;
interface_manager* get_global_interface_manager() {
interface_manager* volatile temp = global_interface_manager;
_ReadWriteBarrier();
if (temp == NULL) {
boost::mutex::scoped_lock(global_interface_manager_creation_mutex);
temp = global_interface_manager;
if (temp == NULL) {
temp = new interface_manager();
_ReadWriteBarrier();
global_interface_manager = temp;
}
}
return temp;
}
但我不想使用锁和内存屏障,所以将代码更改为:
interface_manager* get_global_interface_manager() {
interface_manager* volatile temp = global_interface_manager;
__assume(temp != NULL);
if (temp == NULL) {
temp = new interface_manager();
if(NULL != ::InterlockedCompareExchangePointer((volatile PVOID *)&global_interface_manager, temp, NULL)) {
delete temp;
temp = global_interface_manager;
}
}
return temp;
}
看起来这段代码运行良好,但我不确定,我真的不知道如何测试它是否正确。
【问题讨论】:
-
一个“经理单身人士”,真的吗?呃...
-
不要使用单例,问题解决了。
-
这是我的求知欲。你知道我的意思。
-
不,不是。求知欲通常是关于具有智力价值的事物。人们通常对“我怎样才能让我的设计更糟”没有太多的求知欲。单例是一个可怕的想法,最好将你的求知欲引导到“我如何在没有单例的情况下编写代码”。
标签: c++ multithreading visual-c++ singleton