【问题标题】:Is this code a working critical section wrapper class此代码是否是有效的关键部分包装类
【发布时间】:2011-12-16 02:12:10
【问题描述】:

我实际上有 2 个问题,这是第一个。

使用我在两个不同站点找到的代码,我编写了这两个关键部分包装类。

它会起作用吗?

#ifndef CRITICALSECTION_H
#define CRITICALSECTION_H
#include "windows.h"



class CriticalSection{
    long m_nLockCount;
    long m_nThreadId;
    typedef CRITICAL_SECTION cs;
    cs m_tCS;
public:
    CriticalSection(){
        ::InitializeCriticalSection(&m_tCS);
        m_nLockCount = 0;
        m_nThreadId = 0;
    }
    ~CriticalSection(){ ::DeleteCriticalSection(&m_tCS); }
    void Enter(){ ::EnterCriticalSection(&m_tCS);  }
    void Leave(){  ::LeaveCriticalSection(&m_tCS); }
    void Try();
};


class LockSection{
    CriticalSection* m_pCS;
public:
    LockSection(CriticalSection* pCS){
        m_pCS = pCS;
        if(m_pCS)m_pCS->Enter();
    }
    ~LockSection(){
        if(m_pCS)m_pCS->Leave();
    }
}

/*

Safe class basic structure;

class SafeObj
{
     CriticalSection m_cs;

public:
    void SafeMethod()
    {
        LockSection myLock(&m_cs);
        //add code to implement the method ...

    }
};



*/
#endif

还有第二个问题。浏览here时发现作者没有包含

::Initialize 、 Delete 、 Enter 、 Leave 临界区。这些不是班级正常工作所必需的吗?还是我错过了什么?

【问题讨论】:

  • 这些函数在XYCriticalSection 类中。在您的代码中,SafeMethod 应该是 LockSection myLock(&m_cs);
  • 如果您要求对您的代码进行批评,请在此处发布:codereview.stackexchange.com
  • 显示正常。 Initialize、Delete、Enter 和 Leave 函数在您发布的小示例中。不确定您认为缺少什么?
  • 我会让CriticalSection::Enter/Leave/Try 受保护,friend LockSection,这样可以最大限度地减少错误。此外,CriticalSection 应该有一个私有的未定义赋值运算符,LockSection 应该有复制/赋值运算符。那么你就完全安全了。
  • 感谢大家这么快回答!虽然第二个问题仍然存在,但为什么我上面提到的 codeproject 文章的作者没有使用 ::Initialize 、 ::Enver 、 ::Leave 等?

标签: c++ windows api critical-section


【解决方案1】:

LockSection 类使用RAII 调用EnterLeave。创建对象时,会调用Enter。当对象被销毁(超出范围)时,Leave 会被调用。

InitializeDeleteCriticalSection 类的构造函数和析构函数调用。

学习RAII,好好学习。是你的朋友。

【讨论】:

    【解决方案2】:

    我会回答第一个问题。第二个问题涉及不同站点的代码,您一次只能问一个问题。也许其他人会回答第二个问题。

    您包含的代码将正常工作。成员 m_nLockCountm_nThreadId 未使用且不需要。 Try() 方法没有实现,但你可以删除它

    如果没有分配m_pCS,我个人会引发异常。这是一个明显的错误条件。默默地继续并假装资源受到保护是一种明显的危险。

    【讨论】:

    • 我打算使用它们,但首先,我必须确保代码没问题 =)。感谢您对未分配 m_pCS 时可能出现的错误的说明!
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2020-02-25
    • 2015-04-23
    • 2013-05-04
    • 2016-12-13
    • 2017-11-08
    • 1970-01-01
    相关资源
    最近更新 更多