首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

一个线程安全的单例模式测试

单例模式,一般我喜欢这样实现 class SingleTest { public: static SingleTest *Instance(); protected: SingleTest(); ~SingleTest(); private: int m; }; SingleTest *SingleTest::Instance() { static SingleTest st; return &st; } SingleTest::SingleTest() { m = 0; printf("SingleTest Create\n"); } SingleTest::~SingleTest() { printf("SingleTest Destroy\n"); } 然后这样用 SingleTest *ts = SingleTest::Instance(); 这么实现的一个好处就是比较简单,而且不会有内存泄露。但如果在多线程环境下是否安全呢?多线程环境下可能会有两种情况: 第一,如果两个线程同时调用SingleTest *ts = SingleTest::Instance();,如果线程一先执行构造,但还没构造完,线程二构造的时候发现还没有构造实例,会再次执行构造,单例就变成了两例。 第二,如果两个线程都要对成员变量进行读写,那么会不会发生竞争呢? 理论分析一下: 第一种情况,C++11标准的编译器是线程安全的,C++11标准要求编译器保证static的线程安全。而C++11之前标准的编译器则是不确定,关键看编译器的实现。 第二种情况,任何标准下都不是线程安全的。 第一种情况,因为有标准的硬性规定,倒是不需要测试了。那么第二种情况什么样?写个代码测试一下 #include <stdio.h> #include <pthread.h> #include <unistd.h> class SingleTest { public: static SingleTest *Instance(); void test(); int get(); protected: SingleTest(); ~SingleTest(); private: int m; }; SingleTest *SingleTest::Instance() { static SingleTest st; return &st; } void SingleTest::test() { int i, loc; for (i = 0; i < 5000; ++i) { loc = m; ++loc; m = loc; } } int SingleTest::get() { return m; } SingleTest::SingleTest() { m = 0; printf("SingleTest Create\n"); } SingleTest::~SingleTest() { printf("SingleTest Destroy\n"); } void *threadFunc(void *arg) { SingleTest *ts = SingleTest::Instance(); ts->test(); return NULL; } int main(int argc, char* argv[]) { int s; pthread_t tid1; pthread_t tid2; s = pthread_create(&tid1, NULL, threadFunc, NULL); if (s != 0) printf("thread 1 create error:%d\n", s); s = pthread_create(&tid2, NULL, threadFunc, NULL); if (s != 0) printf("thread 2 create error:%d\n", s); s = pthread_join(tid1, NULL); if (s != 0) printf("thread 1 join error:%d\n", s); s = pthread_join(tid2, NULL); if (s != 0) printf("thread 2 join error:%d\n", s

02
领券