我正在看一個簡單的類,我必須管理關鍵段和鎖,我想用測試用例來說明這一點。這是否有意義,以及如何去做呢?這很困難,因爲驗證類的唯一方法是設置非常複雜的線程場景,即使如此,也沒有一種好方法來測試Win32中關鍵段的泄漏。有沒有更直接的方法來確保它正常工作?單元測試引用關鍵段類
下面的代碼:
CriticalSection.hpp:
#pragma once
#include <windows.h>
#include <boost/shared_ptr.hpp>
namespace WindowsAPI { namespace Threading {
class CriticalSectionImpl;
class CriticalLock;
class CriticalAttemptedLock;
class CriticalSection
{
friend class CriticalLock;
friend class CriticalAttemptedLock;
boost::shared_ptr<CriticalSectionImpl> impl;
void Enter();
bool TryEnter();
void Leave();
public:
CriticalSection();
};
class CriticalLock
{
CriticalSection &ref;
public:
CriticalLock(CriticalSection& sectionToLock) : ref(sectionToLock) { ref.Enter(); };
~CriticalLock() { ref.Leave(); };
};
class CriticalAttemptedLock
{
CriticalSection &ref;
bool valid;
public:
CriticalAttemptedLock(CriticalSection& sectionToLock) : ref(sectionToLock), valid(ref.TryEnter()) {};
bool LockHeld() { return valid; };
~CriticalAttemptedLock() { if (valid) ref.Leave(); };
};
}}
CriticalSection.cpp:
#include "CriticalSection.hpp"
namespace WindowsAPI { namespace Threading {
class CriticalSectionImpl
{
friend class CriticalSection;
CRITICAL_SECTION sectionStructure;
CriticalSectionImpl() { InitializeCriticalSection(§ionStructure); };
void Enter() { EnterCriticalSection(§ionStructure); };
bool TryEnter() { if (TryEnterCriticalSection(§ionStructure)) return true; else return false; };
void Leave() { LeaveCriticalSection(§ionStructure); };
public:
~CriticalSectionImpl() { DeleteCriticalSection(§ionStructure); };
};
void CriticalSection::Enter() { impl->Enter(); };
bool CriticalSection::TryEnter() { return impl->TryEnter(); };
void CriticalSection::Leave() { impl->Leave(); };
CriticalSection::CriticalSection() : impl(new CriticalSectionImpl) {} ;
}}
這個問題很少。 #1。 CRITICAL_SECTION結構不能被移動或複製。這就是首先要考慮的原因。因此,這裏的某種形式的refcount是必不可少的,因爲我不希望客戶不必擔心班級的記憶管理。 #2:我更喜歡你對鎖的處理。非常感謝你:)#3:我將以某種方式嘲笑API函數 - 這很具有諷刺意味,因爲關鍵部分對象的一半是能夠使用它來測試代碼。 – 2010-03-11 14:21:19
我從未發現#1是一個問題;也許這只是我用我的鎖的方式。我只需將一個'CCriticalSection'實例添加到需要能夠鎖定自身區域的類中,然後使用RAII'所有者'類來管理鎖的生命週期。對於有自己的鎖的對象,我很少有一個副本或分配操作;它只是從來沒有道理,所以我沒有問題,不需要裁判計數... – 2010-03-11 14:55:07
我想我可以讓臨界區對象不可複製,但現在我在一個場景,我真的需要臨界區對象具有「'shared_ptr」「語義。如果關鍵部分不需要特別拆卸,我只需使用'shared_ptr'並完成它,但不幸的是他們會這樣做:( – 2010-03-11 15:17:06