Подтвердить что ты не робот

С# lock() в управляемом С++

Имеет ли управляемый С++ эквивалент С# lock() и VB SyncLock? Если да, то как его использовать?

4b9b3361

Ответ 1

Единообразный блокировке /SyncLock должен был бы использовать класс Monitor.

В .NET 1-3.5sp блокировка (obj) делает:

Monitor.Enter(obj);
try
{
    // Do work
}
finally
{
    Monitor.Exit(obj);
}

Начиная с .NET 4, это будет:

bool taken = false;
try
{
    Monitor.Enter(obj, ref taken);
    // Do work
}
finally
{
    if (taken)
    {
        Monitor.Exit(obj);
    }
}

Вы можете перевести это на С++, выполнив:

System::Object^ obj = gcnew System::Object();
Monitor::Enter(obj);
try
{
    // Do work
}
finally
{
    Monitor::Exit(obj);
}

Ответ 2

C++/CLI имеет класс блокировки. Все, что вам нужно сделать, это объявить переменную блокировки, используя семантику на основе стека, и она будет безопасно выходить из монитора при вызове его деструктора, например:

#include <msclr\lock.h>
{    
    msclr::lock l(m_lock);

    // Do work

} //destructor of lock is called (exits monitor).  

Объявление m_lock зависит от того, синхронизируете ли вы доступ к экземпляру или статическому члену.

Чтобы защитить участников экземпляра, используйте это:

Object^ m_lock = gcnew Object(); // Each class instance has a private lock - 
                                 // protects instance members.

Чтобы защитить статические элементы, используйте это:

static Object^ m_lock = gcnew Object(); // Type has a private lock -
                                        // protects static members.

Ответ 3

В С++ нет эквивалента ключевого слова lock. Вы могли бы сделать это вместо этого:

Monitor::Enter(instanceToLock);
try
{
    // Only one thread could execute this code at a time
}
finally
{
    Monitor::Exit(instanceToLock);
}

Ответ 4

Попробуйте Threading.Monitor. И поймать.