Имеет ли управляемый С++ эквивалент С# lock() и VB SyncLock? Если да, то как его использовать?
С# lock() в управляемом С++
Ответ 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. И поймать.