贝贝花花包包店,精品555皮具,钱夹,皮夹

字体:  

ACE, Signleton模式中的竞态条件

印随 发表于: 2008-3-27 15:18 来源: ACE 开发者

//为什么还会出现竞态条件

#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 编辑 ]

最新回复

peakzhang at 2008-3-28 18:14:45
这个Singleton,只保护了对象的指针本身,对象自己的数据,还需要自己的保护。
aalbertini at 2008-3-28 22:57:00
我想这是对singleton的理解有误吧。singleton是保证只有一个对象存在; 而是否允许多个线程操作对象则没有提供任何保证