Windows上的递归关键部分无法正常工作

时间:2017-01-16 16:07:05

标签: multithreading c++-cx critical-section

我有以下用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(&section);

        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]");
    });
}

TaskPool是一个任务调度程序,它使用CRITICAL_SECTION同步分派同步任务。我已阅读here并在其他几个地方确认关键部分是可重入的。但是,我没有复制这种行为。

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]

正如您所看到的,正在调度几个任务。但是,即使第一个任务似乎运行良好,添加到池中的其他任务也不会被分派。由于某种原因,没有输入临界区,线程似乎挂起。如果关键部分是递归的,还有什么可以解释这种行为?

0 个答案:

没有答案