0

という名前の構造体がある画像

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 アーキテクチャで実行する場合、どのような状況でもプログラムがデータ競合に遭遇しないことが保証されていますか?

4

1 に答える 1

0

データがミューテックスによって適切に保護されている場合、データの競合、SMPアーキテクチャがあるかどうかに関係なく、理由はわかりません。

それでも、ミューテックスをどのように管理したかについて疑問がある場合は、データの競合を検出して警告できるvalgrindを使用してプログラムを実行することを躊躇しないでください。

于 2012-12-21T03:04:41.843 に答える