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而我是否只是没有发现错误的幸运儿?
是的,你很幸运,永远不会遇到任何问题.这是同步问题和竞争条件的问题,代码将在99.9%的情况下工作,并且当灾难发生时您将不知道原因.
我将带走以CRITICAL_SECTION作为参数的构造函数,因为如果没有查看(可能是不存在的)文档来实现构造函数将初始化它并不清楚.