锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美一区深夜视频,国产日韩欧美91,国产一区观看http://m.shnenglu.com/flagman/category/15722.html 鍞愪寒鐨勪釜浜烘妧鏈崥瀹? 銆愭榪庤漿杞斤紝浣嗚鏍囨槑鍘熶綔鑰呫?/description>zh-cnMon, 12 Dec 2011 16:19:20 GMTMon, 12 Dec 2011 16:19:20 GMT60C++ library series -- in the MFC multiple-thread environment, how to quit worker-thread safely which begins with AfxBeginThreadhttp://m.shnenglu.com/flagman/archive/2011/12/11/how_to_quit_worker-thread_safely_which_begins_with_AfxBeginThread.htmlflagmanflagmanSun, 11 Dec 2011 12:35:00 GMThttp://m.shnenglu.com/flagman/archive/2011/12/11/how_to_quit_worker-thread_safely_which_begins_with_AfxBeginThread.htmlhttp://m.shnenglu.com/flagman/comments/161934.htmlhttp://m.shnenglu.com/flagman/archive/2011/12/11/how_to_quit_worker-thread_safely_which_begins_with_AfxBeginThread.html#Feedback0http://m.shnenglu.com/flagman/comments/commentRss/161934.htmlhttp://m.shnenglu.com/flagman/services/trackbacks/161934.html
  In the MFC environment, normally, thread should be launched with AfxBeginThread for taking usage of MFC multiple-thread mechanism; In such mechanism, those datastructures, such as AFX_MODULE_STATE, would be used by MFC framework to maintain related thread information. It runs well when threads, launched with AfxBeginThread, quit before the main thread, which is responsible for initializing C run-time, but if such main thread quit before any other thread launched by AfxBeginThread, the current application would crash.
  Such crash comes from the _afxThreadData (CThreadSlotData* _afxThreadData, which is defined in AFXTLS.cpp as global data structure) has been destructed while the main thread quits and it will invoke related function to clean up global data structures, including _afxThreadData definitely.
  Consequently, serious developer should prepare for such case (other worker thread quits before main thread).
  
  The reasonable resolve for such issue, would ensure any other threads should quit before the main thread. 
  
.h file 
  /////////////////////////////////////////////////////////////////////////////
// CSafeEnterLeaveThread thread
class CSafeEnterLeaveThread : public CWinThread
{
DECLARE_DYNCREATE(CSafeEnterLeaveThread)
protected:
CSafeEnterLeaveThread();           // protected constructor used by dynamic creation
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSafeEnterLeaveThread)
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
//}}AFX_VIRTUAL
// Implementation
protected:
virtual ~CSafeEnterLeaveThread();
// Generated message map functions
//{{AFX_MSG(CSafeEnterLeaveThread)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
.cpp file 
/////////////////////////////////////////////////////////////////////////////
// CSafeEnterLeaveThread
IMPLEMENT_DYNCREATE(CSafeEnterLeaveThread, CWinThread)
CSafeEnterLeaveThread::CSafeEnterLeaveThread()
{
}
CSafeEnterLeaveThread::~CSafeEnterLeaveThread()
{
}
BOOL CSafeEnterLeaveThread::InitInstance()
{
// TODO:  perform and per-thread initialization here
ASSERT(this->m_hThread);
CMainApp::RegisterMFCThread(this->m_hThread);
return TRUE;
}
int CSafeEnterLeaveThread::ExitInstance()
{
// TODO:  perform any per-thread cleanup here
ASSERT(this->m_hThread);
CMainApp::UnRegisterMFCThread(this->m_hThread);
return CWinThread::ExitInstance();
}
BEGIN_MESSAGE_MAP(CSafeEnterLeaveThread, CWinThread)
//{{AFX_MSG_MAP(CSafeEnterLeaveThread)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
And in the CMainApp,
set<HANDLE> g_ThreadHandleSet;
HANDLE g_ThreadHandleArray[MAXIMUM_WAIT_OBJECTS];
CCriticalSection g_csGlobalData;
void CAccgbApp::CheckAllOtherMFCThreadsLeave()
{
int count = g_ThreadHandleSet.size();
if (count == 0) return;
set<HANDLE>::iterator it;
int idx = 0;
for (it = g_ThreadHandleSet.begin(); it != g_ThreadHandleSet.end() && idx < MAXIMUM_WAIT_OBJECTS; it++, idx++)
{
g_ThreadHandleArray[idx] = *it;
}
if (count > idx) count = idx;
::WaitForMultipleObjects(count, g_ThreadHandleArray, TRUE, INFINITE);
}
void CAccgbApp::CleanupGlobalData()
{
g_csGlobalData.Lock();
g_ThreadHandleSet.empty();
g_csGlobalData.Unlock();
}
BOOL CAccgbApp::RegisterMFCThread(HANDLE hThread)
{
if (hThread == NULL) return FALSE;
g_csGlobalData.Lock();
if (g_ThreadHandleSet.find(hThread) == g_ThreadHandleSet.end()) 
g_ThreadHandleSet.insert(hThread);
g_csGlobalData.Unlock();
return TRUE;
}
void CAccgbApp::UnRegisterMFCThread(HANDLE hThread)
{
if (hThread == NULL) return;
g_csGlobalData.Lock();
if (g_ThreadHandleSet.find(hThread) != g_ThreadHandleSet.end())
g_ThreadHandleSet.erase(hThread);
g_csGlobalData.Unlock();
}


flagman 2011-12-11 20:35 鍙戣〃璇勮
]]>
C++ library緋誨垪 -- static destructors in multiple threadshttp://m.shnenglu.com/flagman/archive/2011/02/08/static_destructors_in_multiple_threads.htmlflagmanflagmanTue, 08 Feb 2011 12:57:00 GMThttp://m.shnenglu.com/flagman/archive/2011/02/08/static_destructors_in_multiple_threads.htmlhttp://m.shnenglu.com/flagman/comments/139812.htmlhttp://m.shnenglu.com/flagman/archive/2011/02/08/static_destructors_in_multiple_threads.html#Feedback0http://m.shnenglu.com/flagman/comments/commentRss/139812.htmlhttp://m.shnenglu.com/flagman/services/trackbacks/139812.html  In VC++ 8.0, while  code compiled with /clr or /clr:pure, static destructors sometimes would not being properly called before process exites in multiple threads.

  CRT incorrectly set a lock at _global_unlock which resulted in such issue.

  In CLR-mixed mode, during the inialization of static local object, CRT would call _atexit_m(_CPVFV func) in msilexit.cpp to register a special __clrcall callback function which would be called back to destroy such static object when the current AppDomain quited.

  In the multithread environment, _atexit_helper which was invoked by _atexit_m, could register such callbace function successfully because it had been guarded by __global_lock() and __global_unlock(). But in the same environment, the _atexit_m would fail to assign the correct value to __onexitbegin_m and __onexitend_m.

  __onexitbegin_m and __onexitend_m were shared by the different threads; It's the key point of such issue. For example, the following statements,

  __onexitbegin_m = (_CPVFV *)_encode_pointer(onexitbegin_m);
  __onexitend_m = (_CPVFV *)_encode_pointer(onexitend_m);

should also guarded by __global_lock() and __global_unlock() or other syn primitives.


__global_lock();
__onexitbegin_m = (_CPVFV *)_encode_pointer(onexitbegin_m);
__onexitend_m   = (_CPVFV *)_encode_pointer(onexitend_m);
__global_unlock();


extern "C" int __clrcall _atexit_m(_CPVFV func)
{
 MANAGED_ASSERT(AppDomain::CurrentDomain->IsDefaultAppDomain(), "This fuction must be called in the default domain");

 __global_lock();
 _CPVFV* onexitbegin_m = (_CPVFV*)_decode_pointer(__onexitbegin_m);
 _CPVFV* onexitend_m = (_CPVFV*)_decode_pointer(__onexitend_m);
 __global_unlock();

 int retval = _atexit_helper((_CPVFV)_encode_pointer(func), &__exit_list_size, &onexitend_m, &onexitbegin_m);

 __global_lock();
 __onexitbegin_m = (_CPVFV*)_encode_pointer(onexitbegin_m);
 __onexitend_m  = (_CPVFV*)_encode_pointer(onexitend_m);
 __global_unlock();

 return retval;
}



flagman 2011-02-08 20:57 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美中文在线免费| 久久精品国产999大香线蕉| 久久综合电影| 在线看视频不卡| 欧美成人自拍视频| 欧美1区2区3区| av成人免费在线观看| 亚洲精品自在在线观看| 欧美视频精品在线| 欧美亚洲综合久久| 久久久久久色| 亚洲精品美女91| 夜色激情一区二区| 国产精品自拍视频| 欧美 日韩 国产精品免费观看| 六月婷婷一区| 亚洲免费在线精品一区| 性色av一区二区三区红粉影视| 国产一区二区三区在线免费观看| 欧美h视频在线| 欧美午夜精品伦理| 久久五月婷婷丁香社区| 欧美全黄视频| 久久亚洲不卡| 国产精品不卡在线| 欧美sm视频| 欧美日韩精品免费| 麻豆91精品| 欧美午夜一区| 欧美成人乱码一区二区三区| 欧美性色视频在线| 女女同性精品视频| 国产麻豆一精品一av一免费| 欧美国产日本韩| 国产精品网曝门| 亚洲激情视频在线播放| 国产精品一二三视频| 亚洲高清电影| 好看的av在线不卡观看| 亚洲美女黄色| 亚洲丰满在线| 欧美制服丝袜第一页| 亚洲一区二区三区在线视频 | 亚洲人成绝费网站色www| 一区二区三区精品在线 | 牛牛影视久久网| 欧美在线视频观看| 欧美日韩妖精视频| 欧美激情精品久久久久久蜜臀 | 国产精品一区二区三区四区 | 久久久噜噜噜久久狠狠50岁| 欧美日韩亚洲一区在线观看| 欧美韩日亚洲| 精品福利av| 欧美呦呦网站| 久久久九九九九| 国产精品专区第二| 亚洲一区二区三区激情| 亚洲天堂激情| 欧美日韩影院| 99精品福利视频| 亚洲色诱最新| 欧美日韩色一区| a4yy欧美一区二区三区| 一区二区激情小说| 欧美日韩大片| 一区二区久久久久| 亚洲综合首页| 国产精品久久精品日日| 99国产精品国产精品久久 | 国产精品麻豆欧美日韩ww| 日韩视频不卡中文| 国产精品99久久久久久久久久久久| 欧美极品一区| 日韩视频在线播放| 亚洲曰本av电影| 国产欧美日韩一区二区三区在线观看| 亚洲视频1区2区| 欧美一级视频| 黄色av成人| 欧美11—12娇小xxxx| 91久久中文| 亚洲欧美国产精品va在线观看| 国产精品伦理| 欧美中文字幕不卡| 欧美jizz19性欧美| 日韩一级欧洲| 国产伦精品一区二区三| 久久精品国产在热久久| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲美女视频在线观看| 亚洲综合电影一区二区三区| 国产欧美在线看| 卡一卡二国产精品| 亚洲黄一区二区三区| 亚洲欧美激情四射在线日| 国产综合自拍| 欧美精品在线免费播放| 亚洲欧美视频在线观看| 欧美**字幕| 亚洲制服av| 亚洲国产精品一区| 国产精品国产三级国产aⅴ9色| 久久av资源网| 99热在这里有精品免费| 久久精品动漫| 中文成人激情娱乐网| 国内精品久久久久久| 欧美日韩欧美一区二区| 久久国产欧美精品| 亚洲免费成人av| 免费观看成人www动漫视频| 亚洲一区免费看| 最新国产の精品合集bt伙计| 国产精品网站在线播放| 欧美精品日日鲁夜夜添| 久久不射2019中文字幕| 中日韩视频在线观看| 欧美国产日韩精品免费观看| 欧美一区二区三区在| 在线午夜精品自拍| 亚洲第一黄网| 国内自拍一区| 国产精品亚洲不卡a| 欧美不卡福利| 久久综合久久久| 欧美一区高清| 亚洲欧美卡通另类91av| 一本色道久久精品| 亚洲国产毛片完整版| 猫咪成人在线观看| 久久久久一区| 欧美专区在线播放| 亚洲欧美一区二区三区极速播放 | 亚洲一区二区三区中文字幕在线| 亚洲国产高清一区| 激情视频亚洲| 在线欧美小视频| 国内精品久久久久影院色| 国产喷白浆一区二区三区| 国产精品分类| 国产精品素人视频| 国产精品久久久久久亚洲毛片| 欧美性猛交xxxx乱大交蜜桃 | 久久精品在线| 久久99伊人| 久久精品日韩欧美| 久久久精品一品道一区| 久久久久久夜| 免费亚洲一区| 欧美精品福利在线| 欧美日韩不卡| 国产精品毛片a∨一区二区三区|国 | 亚洲破处大片| 亚洲人成在线观看一区二区| 最新国产乱人伦偷精品免费网站| 亚洲国产精品ⅴa在线观看| 亚洲第一区在线| 亚洲精品一区在线观看香蕉| 99riav久久精品riav| 在线一区免费观看| 性欧美8khd高清极品| 久久精品免费电影| 欧美成人精品一区二区| 欧美日韩精品在线视频| 国产精品毛片高清在线完整版| 国产日本欧美在线观看| 影视先锋久久| 一本大道av伊人久久综合| 午夜精品视频| 美女日韩欧美| 夜夜狂射影院欧美极品| 亚洲欧美日韩精品综合在线观看| 久久久999国产| 欧美国产日韩xxxxx| 国产精品久久久久久户外露出 | 国产精品xnxxcom| 黑人一区二区三区四区五区| 亚洲国产精品一区二区三区| 中文在线资源观看视频网站免费不卡| 午夜免费在线观看精品视频| 美女诱惑一区| 亚洲一二三区在线观看| 久久久久国产精品www| 欧美日韩国产色综合一二三四 | 亚洲国产精品久久久久秋霞不卡 | 国内精品久久久久影院色 | 极品尤物久久久av免费看| 这里是久久伊人| 免费在线观看成人av| 一区二区三区不卡视频在线观看| 欧美专区福利在线| 欧美日韩国产页| 亚洲高清不卡在线观看| 欧美一级艳片视频免费观看| 亚洲福利免费| 久久久91精品国产| 国产精品免费观看视频| 99国产精品私拍| 欧美国产先锋|