【问题标题】:C#'s lock() in Managed C++托管 C++ 中的 C# 的 lock()
【发布时间】:2009-09-02 18:45:31
【问题描述】:

托管 C++ 是否具有与 C# 的 lock() 和 VB 的 SyncLock 等效的功能?如果是这样,我该如何使用它?

【问题讨论】:

    标签: multithreading synchronization managed-c++


    【解决方案1】:

    C++/CLI 确实有一个lock 类。你需要做的就是使用基于堆栈的语义声明一个锁变量,当它的析构函数被调用时它会安全地退出监视器,例如:

    #include <msclr\lock.h>
    {    
        msclr::lock l(m_lock);
    
        // Do work
    
    } //destructor of lock is called (exits monitor).  
    

    m_lock 声明取决于您是同步访问实例还是静态成员。

    要保护 instance 成员,请使用:

    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.
    

    【讨论】:

    • 删除了带有“工作”的“危险物品”,以免干扰他人。感谢您的 cmets。
    • 我不熟悉C++,你如何声明'x'?谢谢
    • 'x' 声明的规则与 C# 中的规则相同,如下所述:msdn.microsoft.com/en-us/library/c5kehkcz.aspx。总之,指导方针是: - 如果要保护实例变量,请将其定义为私有对象; - 如果要保护静态变量(或者如果临界区出现在给定类的静态方法中),请将其定义为私有静态对象变量。感谢您的提问 - 我会改进答案。
    【解决方案2】:

    锁 / SyncLock 的等价物是使用 Monitor 类。

    在 .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);
        }
    }
    

    您可以通过以下方式将其转换为 C++:

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

    【讨论】:

    【解决方案3】:

    C++ 中没有 lock 关键字的等效项。你可以这样做:

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

    【讨论】:

      【解决方案4】:

      试试 Threading.Monitor。并抓住。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-23
        • 1970-01-01
        • 2014-12-10
        • 1970-01-01
        • 1970-01-01
        • 2010-09-19
        • 1970-01-01
        相关资源
        最近更新 更多