TNB Library
TnbThreadLocalObject.h
[詳解]
1#pragma once
14#include "TnbMap.h"
15
16
17
18namespace TNB
19{
20
21
22
43template<typename TYP>
45{
46 DWORD m_dwTlsIndex;
47 TYP m_typ;
48 mutable CVectorT<TYP*> m_vpTyp;
50 TYP& m_Get(void) const
51 {
52 TYP* P = static_cast<TYP*>(::TlsGetValue(m_dwTlsIndex));
53 if ( P == NULL )
54 {
55 P = new TYP(m_typ);
56 m_vpTyp.Add(P);
57 ::TlsSetValue(m_dwTlsIndex, P);
58 }
59 return *P;
60 }
61
62public:
63
68 CThreadLocalObjectT(const TYP& t = TYP()) : m_typ(t)
69 {
70 m_dwTlsIndex = ::TlsAlloc();
71 if ( m_dwTlsIndex == TLS_OUT_OF_INDEXES )
72 {
73 throw CEmptyException();
74 }
75 }
76
79 {
80 loop ( i, m_vpTyp.GetSize() )
81 {
82 delete m_vpTyp.At(i);
83 }
84 m_vpTyp.RemoveAll();
85 ::TlsFree(m_dwTlsIndex);
86 }
87
93 const TYP& Get(void) const
94 {
95 return m_Get();
96 }
97
103 void Set(const TYP& t)
104 {
105 m_Get() = t;
106 }
107};
108
109
110
130template<typename TYP>
132{
133 TYP m_typ;
134 mutable CMapT<DWORD, TYP> m_mapTyp;
135public:
136
141 CThreadLocalObjectExT(const TYP& t = TYP()) : m_typ(t)
142 {
143 }
144
147 {
148 }
149
155 const TYP& Get(void) const
156 {
157 EXCLUSIVE(&m_mapTyp);
158 DWORD dw = ::GetCurrentThreadId();
159 if ( ! m_mapTyp.HasKey(dw) )
160 {
161 m_mapTyp[dw] = m_typ;
162 }
163 return m_mapTyp[dw];
164 }
165
171 void Set(const TYP& t)
172 {
173 EXCLUSIVE(&m_mapTyp);
174 DWORD dw = ::GetCurrentThreadId();
175 if ( ! m_mapTyp.HasKey(dw) )
176 {
177 m_mapTyp[dw] = m_typ;
178 }
179 m_mapTyp[dw] = t;
180 }
181};
182
183
184
185};
186
187
188
189#if 0
190
191DWORD gdwTlsIndex = 0;
192
193CThreadLocalStorageT<DWORD> s_tsl_dwData;
194CThreadLocalObjectT<CStr> s_tsl_strData = "#";
195
196
197
198class Receiver : public CSocketUdp::IListener
199{
200public:
201 virtual bool OnSocketEvent(const CSocketEvent& event)
202 {
203 DWORD r = s_tsl_dwData.Get();
204 s_tsl_dwData.Set(::GetCurrentThreadId());
205 TRACE2("[%08X] : %08X\n",::GetCurrentThreadId(), r);
206
207 CStr s = s_tsl_strData.Get();
208 s_tsl_strData.Set("Thread!!");
209 TRACE2("[%08X] : %s\n",::GetCurrentThreadId(),s);
210
211
212
213
214 if ( event.HasEvent() )
215 {
216 TRACE1("%s\n",event.GetEventString());
217 }
218 else
219 {
220 TNB::DumpData(event.GetDataSize(),event.GetData());
221 CStr str;
222 WORD wPort;
223 event.GetPeerName(str, wPort);
224 TRACE2("%s %d\n", str, wPort);
225 event.Send(2,"AB");
226 }
227 return true;
228 }
229};
230
231
232
233void CTnbTestDlg::OnBtnVir()
234{
235 CDwordVector vdwIndex;
236 while ( true )
237 {
238 DWORD d = ::TlsAlloc();
239 if ( d == TLS_OUT_OF_INDEXES )
240 {
241 break;
242 }
243 vdwIndex.Add(d);
244 }
245 TRACE1("max= %d\n",vdwIndex.GetSize());
246
247
248
249
250 DWORD r = s_tsl_dwData.Get();
251 s_tsl_dwData.Set(10222);
252
253 CStr s = s_tsl_strData.Get();
254 s_tsl_strData.Set("Main");
255
256
257#endif
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
マップ型情報管理関係のヘッダ
取得要素(空き)無し例外
Definition: TnbException.h:107
bool HasKey(INK key) const
[確認] キー有無
Definition: TnbMap.h:589
CStr GetEventString(void) const
[取得] イベントコード文字列取得
Definition: TnbReport.h:179
size_t GetDataSize(void) const
[取得] データ長取得
Definition: TnbReport.h:139
bool HasEvent(void) const
[確認] Event(Error)を持っている
Definition: TnbReport.h:130
const BYTE * GetData(void) const
[取得] データアドレス取得
Definition: TnbReport.h:148
Socket共通受信イベント管理クラス
Definition: TnbSocket.h:322
拡張スレッドローカルオブジェクトテンプレートクラス
const TYP & Get(void) const
[取得] 値取得
~CThreadLocalObjectExT(void)
デストラクタ
void Set(const TYP &t)
[設定] 値設定
CThreadLocalObjectExT(const TYP &t=TYP())
コンストラクタ
スレッドローカルオブジェクトテンプレートクラス
const TYP & Get(void) const
[取得] 値取得
CThreadLocalObjectT(const TYP &t=TYP())
コンストラクタ
~CThreadLocalObjectT(void)
デストラクタ
void Set(const TYP &t)
[設定] 値設定
スレッドローカル領域テンプレートクラス
void Set(const TYP &t)
[設定] 値設定
TYP Get(void) const
[取得] 値取得
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
virtual const TYP & At(INDEX index) const
[取得] 要素の参照取得.
Definition: TnbVector.h:233
virtual bool RemoveAll(void)
[削除] 空化
Definition: TnbVector.h:565
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
CStrVector DumpData(size_t size, const void *pData, bool canAllDump=true, size_t width=16, bool isUnicode=false)
[作成] バイナリダンプ用文字配列作成.
Definition: TnbDump.h:35
#define EXCLUSIVE(CLS)
簡易排他制御マクロ.
Definition: TnbSync.h:788
TNB Library
Definition: TnbDoxyTitle.txt:2