找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5422|回复: 2

ACE, Signleton模式中的竞态条件

[复制链接]
发表于 2008-3-27 15:18:52 | 显示全部楼层 |阅读模式
//为什么还会出现竞态条件

#define _REENTRANT
#include <ace/Singleton.h>
#include <ace/Thread_Manager.h>
#include <ace/Thread_Mutex.h>
#include <iostream>


using namespace std;

class normal_test
{
        friend class ACE_Singleton<normal_test, ACE_Thread_Mutex>;

        public:
                    void show_my_life();
                        int get_num(void){return num;}
                        int add_num(void){num++;}

        private:
                        normal_test();
                        int num;

};

normal_test::normal_test(){}

typedef ACE_Singleton<normal_test, ACE_Thread_Mutex> NORMAL_TEST;

void normal_test::show_my_life()
{
            cout << "i'm living at " << (void*)this << endl;
}

void * worker(void *)
{
        for (int i = 0; i < 1000000; i++)
                NORMAL_TEST::instance()->add_num();
}
int ACE_TMAIN(int argc, ACE_TCHAR *argv[])
{
                NORMAL_TEST::instance()->show_my_life();
                ACE_Thread_Manager m_thread_manager;

                m_thread_manager.spawn_n(2, worker, 0);
                m_thread_manager.wait();

                cout << NORMAL_TEST::instance()->get_num() << endl;

                return 0;
}

[ 本帖最后由 印随 于 2008-3-27 15:20 编辑 ]
发表于 2008-3-28 18:14:45 | 显示全部楼层
这个Singleton,只保护了对象的指针本身,对象自己的数据,还需要自己的保护。
发表于 2008-3-28 22:57:00 | 显示全部楼层

回复 #1 印随 的帖子

我想这是对singleton的理解有误吧。singleton是保证只有一个对象存在; 而是否允许多个线程操作对象则没有提供任何保证
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 13:34 , Processed in 0.022151 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表