Имеет ли управляемый C++ эквивалент C# lock()? и SyncLock VB? Если да, то как мне его использовать?
C# lock() в управляемом C++
Ответы (4)
Эквивалентом блокировки / SyncLock будет использование Монитор а> класс.
В .NET 1-3.5sp lock(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);
}
person
Reed Copsey
schedule
02.09.2009
Я бы подумал о stackoverflow.com/questions /1369459/cs-lock-in-managed-c/ превосходит его тем, что он больше соответствует природе C++ (RAII), а также ближе к ключевому слову блокировки C#.
- person sehe; 26.09.2011
C++/CLI имеет класс lock. Все, что вам нужно сделать, это объявить переменную блокировки, используя семантику на основе стека, и она безопасно выйдет из монитора при вызове ее деструктора, например:
#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, используйте это:
static Object^ m_lock = gcnew Object(); // Type has a private lock -
// protects static members.
person
Sereger
schedule
23.09.2011
Удалены «опасные вещи» с «выполняйте работу», чтобы не разрушать людей. Спасибо за ваши комментарии.
- person Sereger; 26.09.2011
Я не знаком с С++, как вы объявляете 'x'? Спасибо
- person Bastiflew; 28.06.2013
Правила объявления 'x' такие же, как и в C#, как описано здесь: msdn. microsoft.com/en-us/library/c5kehkcz.aspx. Подводя итог, руководство таково: - определите его как частный объект, если вы хотите защитить переменную экземпляра; - определите его как частную переменную статического объекта, если вы хотите защитить статическую переменную (или если критическая секция возникает в статическом методе в данном классе). Спасибо за ваш вопрос - я улучшу ответ.
- person Sereger; 29.06.2013
В C++ нет эквивалента ключевому слову lock
. Вместо этого вы можете сделать это:
Monitor::Enter(instanceToLock);
try
{
// Only one thread could execute this code at a time
}
finally
{
Monitor::Exit(instanceToLock);
}
person
Darin Dimitrov
schedule
02.09.2009
Попробуйте Threading.Monitor. И лови.
person
ima
schedule
02.09.2009