本文整理汇总了C++中Thread::IsInitialized方法的典型用法代码示例。如果您正苦于以下问题:C++ Thread::IsInitialized方法的具体用法?C++ Thread::IsInitialized怎么用?C++ Thread::IsInitialized使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Thread
的用法示例。
在下文中一共展示了Thread::IsInitialized方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DetachCurrentThread
void ThreadStore::DetachCurrentThread()
{
// The thread may not have been initialized because it may never have run managed code before.
Thread * pDetachingThread = RawGetCurrentThread();
// The thread was not initialized yet, so it was not attached
if (!pDetachingThread->IsInitialized())
{
return;
}
if (!PalDetachThread(pDetachingThread))
{
return;
}
#ifdef STRESS_LOG
ThreadStressLog * ptsl = reinterpret_cast<ThreadStressLog *>(
pDetachingThread->GetThreadStressLog());
StressLog::ThreadDetach(ptsl);
#endif // STRESS_LOG
ThreadStore* pTS = GetThreadStore();
ReaderWriterLock::WriteHolder write(&pTS->m_Lock);
ASSERT(rh::std::count(pTS->m_ThreadList.Begin(), pTS->m_ThreadList.End(), pDetachingThread) == 1);
pTS->m_ThreadList.RemoveFirst(pDetachingThread);
pDetachingThread->Destroy();
}
示例2: AttachCurrentThread
// static
void ThreadStore::AttachCurrentThread(bool fAcquireThreadStoreLock)
{
//
// step 1: ThreadStore::InitCurrentThread
// step 2: add this thread to the ThreadStore
//
// The thread has been constructed, during which some data is initialized (like which RuntimeInstance the
// thread belongs to), but it hasn't been added to the thread store because doing so takes a lock, which
// we want to avoid at construction time because the loader lock is held then.
Thread * pAttachingThread = RawGetCurrentThread();
// On CHK build, validate that our GetThread assembly implementation matches the C++ implementation using
// TLS.
CreateCurrentThreadBuffer();
ASSERT(_fls_index != FLS_OUT_OF_INDEXES);
Thread* pThreadFromCurrentFiber = (Thread*)PalFlsGetValue(_fls_index);
if (pAttachingThread->IsInitialized())
{
if (pThreadFromCurrentFiber != pAttachingThread)
{
ASSERT_UNCONDITIONALLY("Multiple fibers encountered on a single thread");
RhFailFast();
}
return;
}
if (pThreadFromCurrentFiber != NULL)
{
ASSERT_UNCONDITIONALLY("Multiple threads encountered from a single fiber");
RhFailFast();
}
//
// Init the thread buffer
//
pAttachingThread->Construct();
ASSERT(pAttachingThread->m_ThreadStateFlags == Thread::TSF_Unknown);
ThreadStore* pTS = GetThreadStore();
ReaderWriterLock::WriteHolder write(&pTS->m_Lock, fAcquireThreadStoreLock);
//
// Set thread state to be attached
//
ASSERT(pAttachingThread->m_ThreadStateFlags == Thread::TSF_Unknown);
pAttachingThread->m_ThreadStateFlags = Thread::TSF_Attached;
pTS->m_ThreadList.PushHead(pAttachingThread);
//
// Associate the current fiber with the current thread. This makes the current fiber the thread's "home"
// fiber. This fiber is the only fiber allowed to execute managed code on this thread. When this fiber
// is destroyed, we consider the thread to be destroyed.
//
PalFlsSetValue(_fls_index, pAttachingThread);
}
示例3: RawGetCurrentThread
// static
Thread * ThreadStore::GetCurrentThreadIfAvailable()
{
Thread * pCurThread = RawGetCurrentThread();
if (pCurThread->IsInitialized())
return pCurThread;
return NULL;
}
示例4: DetachCurrentThreadIfHomeFiber
void ThreadStore::DetachCurrentThreadIfHomeFiber()
{
//
// Note: we call this when each *fiber* is destroyed, because we receive that notification outside
// of the Loader Lock. This allows us to safely acquire the ThreadStore lock. However, we have to be
// extra careful to avoid cleaning up a thread unless the fiber being destroyed is the thread's "home"
// fiber, as recorded in AttachCurrentThread.
//
// The thread may not have been initialized because it may never have run managed code before.
Thread * pDetachingThread = RawGetCurrentThread();
ASSERT(_fls_index != FLS_OUT_OF_INDEXES);
Thread* pThreadFromCurrentFiber = (Thread*)PalFlsGetValue(_fls_index);
if (!pDetachingThread->IsInitialized())
{
if (pThreadFromCurrentFiber != NULL)
{
ASSERT_UNCONDITIONALLY("Detaching a fiber from an unknown thread");
RhFailFast();
}
return;
}
if (pThreadFromCurrentFiber == NULL)
{
// we've seen this thread, but not this fiber. It must be a "foreign" fiber that was
// borrowing this thread.
return;
}
if (pThreadFromCurrentFiber != pDetachingThread)
{
ASSERT_UNCONDITIONALLY("Detaching a thread from the wrong fiber");
RhFailFast();
}
#ifdef STRESS_LOG
ThreadStressLog * ptsl = reinterpret_cast<ThreadStressLog *>(
pDetachingThread->GetThreadStressLog());
StressLog::ThreadDetach(ptsl);
#endif // STRESS_LOG
ThreadStore* pTS = GetThreadStore();
ReaderWriterLock::WriteHolder write(&pTS->m_Lock);
ASSERT(rh::std::count(pTS->m_ThreadList.Begin(), pTS->m_ThreadList.End(), pDetachingThread) == 1);
pTS->m_ThreadList.RemoveFirst(pDetachingThread);
pDetachingThread->Destroy();
}
示例5: AttachCurrentThread
// static
void ThreadStore::AttachCurrentThread(bool fAcquireThreadStoreLock)
{
//
// step 1: ThreadStore::InitCurrentThread
// step 2: add this thread to the ThreadStore
//
// The thread has been constructed, during which some data is initialized (like which RuntimeInstance the
// thread belongs to), but it hasn't been added to the thread store because doing so takes a lock, which
// we want to avoid at construction time because the loader lock is held then.
Thread * pAttachingThread = RawGetCurrentThread();
// On CHK build, validate that our GetThread assembly implementation matches the C++ implementation using
// TLS.
CreateCurrentThreadBuffer();
// The thread was already initialized, so it is already attached
if (pAttachingThread->IsInitialized())
{
return;
}
PalAttachThread(pAttachingThread);
//
// Init the thread buffer
//
pAttachingThread->Construct();
ASSERT(pAttachingThread->m_ThreadStateFlags == Thread::TSF_Unknown);
// The runtime holds the thread store lock for the duration of thread suspension for GC, so let's check to
// see if that's going on and, if so, use a proper wait instead of the RWL's spinning. NOTE: when we are
// called with fAcquireThreadStoreLock==false, we are being called in a situation where the GC is trying to
// init a GC thread, so we must honor the flag to mean "do not block on GC" or else we will deadlock.
if (fAcquireThreadStoreLock && (RhpTrapThreads != 0))
RedhawkGCInterface::WaitForGCCompletion();
ThreadStore* pTS = GetThreadStore();
ReaderWriterLock::WriteHolder write(&pTS->m_Lock, fAcquireThreadStoreLock);
//
// Set thread state to be attached
//
ASSERT(pAttachingThread->m_ThreadStateFlags == Thread::TSF_Unknown);
pAttachingThread->m_ThreadStateFlags = Thread::TSF_Attached;
pTS->m_ThreadList.PushHead(pAttachingThread);
}
示例6: AttachCurrentThread
// static
void ThreadStore::AttachCurrentThread(bool fAcquireThreadStoreLock)
{
//
// step 1: ThreadStore::InitCurrentThread
// step 2: add this thread to the ThreadStore
//
// The thread has been constructed, during which some data is initialized (like which RuntimeInstance the
// thread belongs to), but it hasn't been added to the thread store because doing so takes a lock, which
// we want to avoid at construction time because the loader lock is held then.
Thread * pAttachingThread = RawGetCurrentThread();
// On CHK build, validate that our GetThread assembly implementation matches the C++ implementation using
// TLS.
CreateCurrentThreadBuffer();
// The thread was already initialized, so it is already attached
if (pAttachingThread->IsInitialized())
{
return;
}
PalAttachThread(pAttachingThread);
//
// Init the thread buffer
//
pAttachingThread->Construct();
ASSERT(pAttachingThread->m_ThreadStateFlags == Thread::TSF_Unknown);
ThreadStore* pTS = GetThreadStore();
ReaderWriterLock::WriteHolder write(&pTS->m_Lock, fAcquireThreadStoreLock);
//
// Set thread state to be attached
//
ASSERT(pAttachingThread->m_ThreadStateFlags == Thread::TSF_Unknown);
pAttachingThread->m_ThreadStateFlags = Thread::TSF_Attached;
pTS->m_ThreadList.PushHead(pAttachingThread);
}