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);
}
それで、私の状況ではCRITICAL_SECTIONを使用する必要がありますか?私は間違いを見つけなかった幸運な人ですか?