印随 发表于 2008-3-27 15:18:52

ACE, Signleton模式中的竞态条件

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

#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 发表于 2008-3-28 18:14:45

这个Singleton,只保护了对象的指针本身,对象自己的数据,还需要自己的保护。

aalbertini 发表于 2008-3-28 22:57:00

回复 #1 印随 的帖子

我想这是对singleton的理解有误吧。singleton是保证只有一个对象存在; 而是否允许多个线程操作对象则没有提供任何保证
页: [1]
查看完整版本: ACE, Signleton模式中的竞态条件