어떠한 데이타에 접근할떄 자동으로 CRITICAL_SECTION 을 호출해주는 방법
갤3
어떠한 데이타에 접근할떄 자동으로 critical_section 을 호출해주는 방법
안녕하세요.
파티라는 데이타가 있습니다
외부에서 이파티 데이타에 접근할때 critical_section 을 걸어주려 합니다
그렇게 되면
manager.getdata();
...
manager.releasedata();
이런식으로 해제되는 코드를 넣어주어야 합니다그래서 아래와 같이 만들어봤는데요..
#include stdafx.h
#include windows.h
#include assert.h
typedef struct _stpartydata
{
int iidx;
tchar szname[20];
critical_section *pcs;
}stpartydata;
template class t
class cptrmanager
{
public:
t *m_pdata;
critical_section *m_pcs;
cptrmanager(t *_data, critical_section *_pcs)
{
m_pcs = _pcs;
m_pdata = _data;
}
~cptrmanager()
{
leavecriticalsection(m_pcs);
}
inline t *getdata()
{
entercriticalsection(m_pcs);
return m_pdata;
}
};
class cpartymanager
{
private:
stpartydata m_astpartydata[20];
public:
cpartymanager()
{
for(int i=0; i20; i++){
m_astpartydata[i].pcs = new critical_section;
initializecriticalsection(m_astpartydata[i].pcs);
}
}
~cpartymanager()
{
}
inline stpartydata *getdata(int _iarridx)
{
return &m_astpartydata[_iarridx];
}
inline critical_section *getcs(int _iarridx)
{
return m_astpartydata[_iarridx].pcs;
 sp; }
};
int _tmain(int argc, _tchar* argv[])
{
cpartymanager manager;
cptrmanagerstpartydata pdata(manager.getdata(2), manager.getcs(2));
stpartydata *p = pdata.getdata();
return 0;
}이렇게 만들어봤습니다
이렇게 처리하면 pdata 를 사용하다가 소멸되는 순간에 critical_section 이 종료되므로 신경을 안써도 됩니다
근데 문제점이 cpartymanager::getdata() 함수를 외부에서 직접사용해서 파티데이타에 접근할수 있습니다
(public 이므로) 그래서 private 로도 해보고 friend 도 하려해봤는데...적당한 방법이 생각이 안나네요..
정리하자면 cpartymanager::getdata() 함수를 cptrmanager 에서만 접근가능하게 하려합니다..
혹은 구조를 바꿔서 좀더 획기적인 방법이 없나요?
제가 봐도 많이 허접스러운데요..ㅠㅠ