1

std:mapマルチスレッド アプリケーションでの使用に問題があります。スレッドがこのオブジェクトに書き込んでいるときにマップ オブジェクトをロックする必要があります。このオブジェクトを読み取る別のスレッドは、書き込みプロセスが終了するまで並行して処理する必要があります。

サンプルコード:

std::map<int, int> ClientTable;

int write_function() //<-- only one thread uses this function
{
  while(true)
  {
    //lock ClientTable
    ClientTable.insert(std::pair<int, int>(1, 2)); // random values
    //unlock ClientTable

    //thread sleeps for 2 secs
  }
}

int read_function()  //<--- many thread uses this function
{
  while(true)
  {
     int test = ClientTable[2]; // just for test
  }
}

この std::map オブジェクトをロックして、このスレッドを正しく同期する方法は?

4

2 に答える 2

2

必要なのは典型的な読み取り/書き込みロックであり、任意の数のリーダーを許可しますが、ライターは 1 つだけです。ブーストのshared_mutexを見ることができます。

追加の使用例は、次の場所にあります

于 2012-07-08T12:59:21.697 に答える
0

std::map には組み込みのロックがないため、マップを保護する別のロックを使用する必要があります。マップがそのロックによって保護されているすべての場合、マップをサブクラス化して、「ロック」および「ロック解除」呼び出しとともにロックを追加できますが、ロックが他のアイテムにも使用される場合は、おそらく最良のアイデアではありませんそれを行う。

「正しく同期する方法」に関しては、それは手元のアプリケーションに非常に固有のものです。ただし、この例では、読み取り操作の周りにもロック/ロック解除の呼び出しを挿入する必要があります。

読み取り/書き込みロックを使用している場合、これはこれらのいずれかに適したアプリケーションになる可能性があります。

于 2012-07-08T12:54:25.943 に答える