혹시나 하는 마음에 또 올립니다 ^^'''
역시.. 스마트 포인터가 마법(?)은 아니니까요^^
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <iostream.h>
#pragma hdrstop
#define BOOST_THREAD_USE_LIB
#include <boost/thread/thread.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/shared_ptr.hpp>
using boost::thread;
using boost::scoped_ptr;
using boost::shared_ptr;
//---------------------------------------------------------------------------
#pragma argsused
class TZMy
{
public:
explicit TZMy(const AnsiString& filename) {};
void sayMe() { printf("I'm TZMy\n"); }
};
class TZAbThread
{
public:
TZAbThread( boost::shared_ptr<TZMy> p )
{
m_p = p;
printf("thread: %d\n", m_p.use_count());
}
TZAbThread( TZMy* p )
{
m_op = p;
printf("thread: %d\n", m_p.use_count());
}
void operator() ()
{
while( true )
{
static int i = 0;
i++;
printf("%d> %d, use count %d\n", GetCurrentThreadId(), i, m_p.use_count());
Sleep(100);
if( i == 20 ) break;
}
}
private:
boost::shared_ptr<TZMy> m_p;
TZMy* m_op;
};
boost::shared_ptr<TZMy> createMy()
{
boost::shared_ptr<TZMy> sp( new TZMy("Hello") );
cout << "first " << sp.use_count() << endl;
return sp;
}
TZMy* createMy2()
{
boost::shared_ptr<TZMy> sp( new TZMy("Hello") );
cout << "first " << sp.use_count() << endl;
return sp.get();
}
int main(int argc, char* argv[])
{
//boost::shared_ptr<TZMy> sp( new TZMy("Hello") );
boost::shared_ptr<TZMy> sp = createMy();
sp->sayMe();
printf("main1: use count %d\n", sp.use_count());
boost::shared_ptr<boost::thread> myThread( new boost::thread(TZAbThread(sp)) );
//boost::shared_ptr<boost::thread> myThread2( new boost::thread(TZAbThread(sp)) );
boost::shared_ptr<boost::thread> myThread2( new boost::thread(TZAbThread(sp.get())) );
printf("main2: use count %d\n", sp.use_count());
myThread->join();
myThread2->join();
system("pause");
return 0;
}
//---------------------------------------------------------------------------
|