Fáb*_*osa 5 multithreading critical-section c++-cx
我有以下用 C++/CX 编写的代码:
TaskPool^ TaskPool::Instance::get()
{
// Prevent acquiring the critical section for a static initialization
// after it's been properly initialized.
if (TaskPool::_instance == nullptr) {
static CRITICAL_SECTION section;
CriticalSection lock(§ion);
if (TaskPool::_instance == nullptr) {
_instance = ref new TaskPool();
InitializeCriticalSection(GetCriticalSection());
}
}
return _instance;
}
TaskPool^ TaskPool::_instance;
CRITICAL_SECTION TaskPool::_criticalSection;
void Threading::TaskPool::TaskRun(Concurrency::task<void> & task)
{
Log::LogMessage(this->GetType()->FullName, Level::Debug, "TaskRun [entering]");
EnterCriticalSection(GetCriticalSection());
Log::LogMessage(this->GetType()->FullName, Level::Debug, "TaskRun [entered]");
create_task(task).then([this]() {
Log::LogMessage(this->GetType()->FullName, Level::Debug, "TaskRun [leaving]");
LeaveCriticalSection(GetCriticalSection());
Log::LogMessage(this->GetType()->FullName, Level::Debug, "TaskRun [left]");
});
}
Run Code Online (Sandbox Code Playgroud)
TaskPool是一个任务调度器,它使用 aCRITICAL_SECTION来同步调度相关任务。我已经在这里阅读并在其他几个地方确认了临界区是可重入的。但是,我无法复制这种行为。
Threading.TaskPool <Debug> TaskRun [entering]
Threading.TaskPool <Debug> TaskRun [entered]
Threading.TaskPool <Debug> TaskRun [leaving]
Threading.TaskPool <Debug> TaskRun [left]
Threading.TaskPool <Debug> TaskRun [entering]
Threading.TaskPool <Debug> TaskRun [entering]
Run Code Online (Sandbox Code Playgroud)
如您所见,正在分派多个任务。然而,即使第一个任务看起来运行良好,添加到池中的其他任务也没有被分派。出于某种原因,没有进入临界区,线程似乎挂了。如果临界区是递归的,还有什么可以解释这种行为?