关键部分 - 是或不是?

che*_*r89 2 c++ winapi critical-section

我正在使用WinSock2和WinAPI函数编写聊天.我有点麻烦.
我将std :: vector的客户端连接存储在服务器上.当新客户端连接时,新线程启动并且所有与客户端一起工作都在这个新线程中完成.我不使用类(我知道它不是很好)所以这个连接列表只是定义为全局变量.
在我看来,当几个线程同时尝试访问此列表时,可能会出现这种情况.虽然我没有注意到它有任何问题,我是否需要做这样的事情:


template 
class SharedVector {
    std::vector vect;
    CRITICAL_SECTION cs;
    SharedVector(const SharedVector& rhs) {}
public:
    SharedVector();
    explicit SharedVector(const CRITICAL_SECTION& CS);
    void PushBack(const T& value);
    void PopBack();
    unsigned int size();
    T& operator[](int index);
    virtual ~SharedVector();
};

template
SharedVector::SharedVector() {
    InitializeCriticalSection(&cs);
}

template
SharedVector::SharedVector(const CRITICAL_SECTION& r): cs(r) {
    InitializeCriticalSection(&cs);
}

template
void SharedVector::PushBack(const T& value) {
    EnterCriticalSection(&cs);
    vect.push_back(value);
    LeaveCriticalSection(&cs);
}

template
void SharedVector::PopBack() {
    EnterCriticalSection(&cs);
    vect.pop_back();
    LeaveCriticalSection(&cs);
}
Run Code Online (Sandbox Code Playgroud)

那么,我的情况是否需要使用CRITICAL_SECTION而我是否只是没有发现错误的幸运儿?

eri*_*len 7

是的,你很幸运,永远不会遇到任何问题.这是同步问题和竞争条件的问题,代码将在99.9%的情况下工作,并且当灾难发生时您将不知道原因.

我将带走以CRITICAL_SECTION作为参数的构造函数,因为如果没有查看(可能是不存在的)文档来实现构造函数将初始化它并不清楚.