Lod*_*dle 3 multithreading visual-studio c++11
在msvc上,如果您尝试加入不可连接的线程,它将调用中止。因此,您必须在调用join之前检查线程是否可连接,但这本身就是竞争条件。
void BaseThread::join()
{
auto thread = m_pPrivates->m_pThread;
if (!thread)
return;
if (thread->get_id() != std::thread::id() && thread->joinable())
thread->join();
}
Run Code Online (Sandbox Code Playgroud)
如果线程不可连接,或者是否有更好的方法可以阻止运行时调用异常终止?
。
。
。
编辑:
因此,这是在Visual Studio运行时处理线程关闭的功能。
int _Thrd_join(_Thrd_t thr, int *code)
{ /* return exit code when thread terminates */
unsigned long res;
if (WaitForSingleObject(thr._Hnd, INFINITE) == WAIT_FAILED || GetExitCodeThread(thr._Hnd, &res) == 0)
return (_Thrd_error);
if (code)
*code = (int)res;
return (CloseHandle(thr._Hnd) == 0 ? _Thrd_error : _Thrd_success);
}
Run Code Online (Sandbox Code Playgroud)
最后一行(CloseHandle)抛出此异常:
Unhandled exception at 0x7750BCEC (ntdll.dll) in desura.exe: 0xC0000008: An invalid handle was specified. Which then crashes the app
Run Code Online (Sandbox Code Playgroud)
这并不是天生的竞争条件。线程保持可连接状态,直到被连接,分离或移出。这些都是程序所能控制的,并且如果另一个线程正在与您尝试加入的线程异步地执行这些操作之一,则显然您必须进行同步。通常,它不是,而您是线程的所有者/管理者。
请注意,仅仅因为线程完成了执行,就不会使它不可联接。实际上,即使可以保证线程已完成执行,仍然必须与线程连接(或分离线程等)以防止terminate()被调用。
| 归档时间: |
|
| 查看次数: |
1078 次 |
| 最近记录: |