という名前の構造体がある画像
struct _Visitors{
int totalNum;
map<uintptr_t, Visitor*> visitorMap;
};
Visitor は C++ クラスであることに注意してください
次に、struct _visitors のインスタンスを指すポインターを宣言します。つまり、
struct _Visitors* pVisitors = NULL;
現在、3 つのスレッドがあります。1 つのメイン スレッド t1、2 つの作業スレッド t2 および t3 です。
t1 は次のようなものです。
pVisitors = new _visitors();
t2 は次のようなものです。
while(true){
if a new visitor v enters
//pthread_mutex_lock(mtx);
pVisitors->totalNum++;
visitorMap[v.getVid()] = &v;
//pthread_mutex_unlock(mtx);
}
t3 は次のようなものです。
while(true){
if a new visitor v leaves
//pthread_mutex_lock(mtx);
pVisitors->totalNum--;
visitorMap.eraseAt[v.getVid()];
//pthread_mutex_unlock(mtx);
}
スレッド t1 と t2 が struct _Visitors のグローバル インスタンスでデータ競合を起こす可能性があることはわかっているので、struct _visitors の totalNum フィールドと visitorMap フィールドを保護するために排他的ロック (mutex) を追加します。
私の質問は次のとおりです。構造体 _Visitors のフィールドを保護するために排他ロックを追加するだけで十分ですか? 複数のプロセッサを搭載した SMP アーキテクチャで実行する場合、どのような状況でもプログラムがデータ競合に遭遇しないことが保証されていますか?