вызовы чередуются:

веденном ниже примере вызов HandleChangesAsync выполняется из асинхронной задачи и через обработчик событий.

Вопрос - Есть ли способ гарантировать, что только один поток может одновременно выполнять блоки продолжения задачи HandleChangesAsync create_task + (даже если блоки продолжения задачи вызывают другие асинхронные функции)?

Обратите внимание, что я не могу просто использовать примитив синхронизации, потому что HandleChangesAsync может вернуться до завершения асинхронных операций.

void MyClass::DoStuffAsync()
{    
    WeakReference weakThis(this);
    create_task(DoMoreStuffAsync())
        .then([weakThis]())
    {
        auto strongThis = weakThis.Resolve<HomePromotionTemplateViewModel>();
        if (strongThis)
        {
            strongThis->RegisterForChanges();
            strongThis->HandleChangesAsync();
        }
    });
}

void MyClass::RegisterForChanges()
{    
    // Attach event handler to &MyClass::OnSomethingChanged
}

void MyClass::OnSomethingChanged()
{
    HandleChangesAsync();
}

void MyClass::HandleChangesAsync()
{    
    WeakReference weakThis(this);
    create_task(DoMoreCoolStuffAsync(m_needsProtection))
        .then([weakThis]()
    {
        // do async stuff 
        // update m_needsProtection
    })
        .then([weakThis]()
    {
     ,   // do more async stuff 
        // update m_needsProtection
    });
}

Ответы на вопрос(1)

Ваш ответ на вопрос