我需要处理来自多个线程的数组,因此我使用CRITICAL SECTION为它提供对数据的独占访问.
这是我的模板:
这是我的模板:
#include "stdafx.h" #ifndef SHAREDVECTOR_H #define SHAREDVECTOR_H #include <vector> #include <windows.h> template<class T> class SharedVector { std::vector<T> vect; CRITICAL_SECTION cs; SharedVector(const SharedVector<T>& rhs) {} public: SharedVector(); explicit SharedVector(const CRITICAL_SECTION& CS); void PushBack(const T& value); void PopBack(); unsigned int size() const; T& operator[](int index); virtual ~SharedVector(); }; template<class T> SharedVector<T>::SharedVector() { InitializeCriticalSection(&cs); } template<class T> SharedVector<T>::SharedVector(const CRITICAL_SECTION& r): cs(r) { InitializeCriticalSection(&cs); } template<class T> void SharedVector<T>::PushBack(const T& value) { EnterCriticalSection(&cs); vect.push_back(value); LeaveCriticalSection(&cs); } template<class T> void SharedVector<T>::PopBack() { EnterCriticalSection(&cs); vect.pop_back(); LeaveCriticalSection(&cs); } template<class T> unsigned int SharedVector<T>::size() const { EnterCriticalSection(&cs); unsigned int result = vect.size(); LeaveCriticalSection(&cs); return result; } template<class T> T& SharedVector<T>::operator[](int index) { EnterCriticalSection(&cs); T result = vect[index]; LeaveCriticalSection(&cs); return result; } template<class T> SharedVector<T>::~SharedVector() { DeleteCriticalSection(&cs); }
在编译时我遇到了调用EnterCriticalSection(& cs)和LeaveCriticalSection(& cs)的问题:
'EnterCriticalSection' : cannot convert parameter 1 from 'const CRITICAL_SECTION *' to 'LPCRITICAL_SECTION'
我不知道出了什么问题.可能你可以看到.只因为我总是以这种方式使用它而且没关系. windows.h包括在内
解决方法
只需将cs声明为:
mutable CRITICAL_SECTION cs;
或者删除size()上的const子句
输入临界区会修改CRITICAL_SECTION,然后再次修改它.由于进入和离开一个临界区不会使size()方法在逻辑上非const,我会说它保持声明为const,并使cs可变.这是引入可变的情况类型.
另外 – 看看Martin York和Joe Mucchiello的建议 – 尽可能使用RAII来处理需要清理的任何类型的资源.这对于关键部分和指针和文件句柄一样有效.