c – 使用EnterCriticalSection的问题

前端之家收集整理的这篇文章主要介绍了c – 使用EnterCriticalSection的问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要处理来自多个线程的数组,因此我使用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 YorkJoe Mucchiello的建议 – 尽可能使用RAII来处理需要清理的任何类型的资源.这对于关键部分和指针和文件句柄一样有效.

猜你在找的C&C++相关文章