1

サーバーが複数のクライアントからの接続を追跡する必要があるアプリケーションを作成しています。各クライアントには、識別のためにすべてのパケットで送信する接続 ID が割り当てられます。接続 ID をクライアント情報にマップしたい。以前は std::map を使用していましたが、スレッドセーフではないことがわかりました。この機能をプレーンな C++03 でサポートできるコンテナーが必要です。サードパーティのライブラリは許可されていません (ラボ機器を使用)。これに失敗した場合、std::map とある種のロックを使用してこれを達成する方法を教えてください

データ構造を info と呼びましょう。実行中の 2 つのスレッドがあります (それぞれ送信と受信用)。それらは、情報に対して次の操作を実行します:-

recv_thread {
  //read id
  if(id == 0) info.insert(0,clientdata);
  else {
       do stff, update info[id]
}

send_thread { 
     for each key in info:
       if (key==0) {
          delete info[0];
          info.insert(connid, clientdata);
       }
       else {
           update info[key]
           if(client taking too long) delete info[key];
       }
 }
4

3 に答える 3

1

__sync_fetch_and_addを使用して次のconnidを取得し、pthreadミューテックスを使用して他のマップ呼び出しをラップします。

pthread_mutex_t mutex;
int nextConnid = 1;
...
pthread_mutex_init(&mutex, NULL);
...
recv_thread {
  //read id
  if(id == 0) 
    info.insert(__sync_fetch_and_add(&nextConnid, 1), clientdata);
  else {
       do stff, 
       pthread_mutex_lock(&mutex);
       update info[id]
       pthread_mutex_unlock(&mutex);
}

send_thread { 
     for each key in info:
           pthread_mutex_lock(&mutex);
           update info[key]
           pthread_mutex_unlock(&mutex);
           if(client taking too long) delete info[key];

 }
于 2013-02-20T19:07:06.583 に答える
1

例を参照してください: -

http://en.cppreference.com/w/cpp/thread/mutex

ミューテックスを使用して std::map を作成するため

于 2013-02-20T18:51:34.257 に答える