0

std::map ソケット マップがあり、それがマルチスレッド アプリケーションであるとします。ソケット データを送信するためにマップ内のソケットにアクセスするスレッドは複数ありますが、データを受信するためにマップ内のソケットにアクセスするスレッドは 1 つだけであり、このスレッドはリモート エンドが閉じると SocketInfo* も削除します。

上記の状況で、読み取り/書き込みロック (pthread_rwlock_t) を使用してスレッドを同期できますか? はいの場合、pthread_mutex_t よりも多くの利点がありますか?

スティーブ

[疑似コード]

     class CSocketIO {  
         std::map<int, SocketInfo*> m_Sockets; //socket value and socket info
         pthread_t  m_ReadingSocketThreads;   // for reading socket data
     };

     class CSession {
         void SendOutNetworkPackets(); //access sockets for sending sock data
         pthread_t m_WorkerThread;     // do jobs and send sock data
     };

     class CSomeClass {
         void SendOutNetworkPackets(); // also access sockets
         pthread_t m_WorkerThread;     // do jobs and send sock data
     };
4

2 に答える 2

0

はい、これを行うために読み取り/書き込みロックを使用できます。実際にそうすることをお勧めします。

利点は、読み取り/書き込みロックを使用して複数の同時リーダーを使用できることです。単純なミューテックスを使用した場合、1 つのスレッドが読み取り中の場合、読み取りを必要とする他のスレッドがブロックされ、読み取りが効果的にシリアル化されます。読み取り/書き込みロックでは、書き込みが発生している場合にのみリーダーがブロックされます。

于 2013-06-04T13:46:27.250 に答える
0

2 つのスレッドが同じソケットに同時に書き込むことを許可していませんよね? SocketInfo*からのルックアップを保護したいだけですmapか?

リーダー/ライター ロックはほとんど有益ではなく、多くの場合有害です。マルチスレッド プログラムに非決定論的なバグがあるクライアントがいる場合、最初に探す原因は、不適切に使用されたリーダー/ライター ロックです。(リーダー ロックは、真の関数呼び出しを保護するためにのみ使用できますconst。)

おそらく、各スレッドは次のようなことを行っています。

// do some work to figure out what to send
SocketInfo* my_socket_info = 0;

// critical section begins here
pthread_mutex_lock(the_map_mutex);
socket_map_t::const_iterator i = m_Sockets.find(id);
if (i != m_Sockets.end()) {
  my_socket_info = i->second;
}
pthread_mutex_unlock(the_map_mutex);
// critical section is done

if (my_socket_info != 0) {
  // do a bunch of work to actually send the data
  // (including acquiring a mutex specific to the socket unless
  // you have some other way of guaranteeing that the socket isn't
  // currently being written by some other thread)

2 つ目の質問 (「本当に保護しているものは何ですか?」の後に) は、ロックされconstている時間の割合はどれくらいかということです。the_map_mutex約 50% 未満の場合は、リーダー/ライター ロックを成功させるのに十分な競合がありません。the_map_mutex1 つのスレッドがクリティカル セクション内で費やす時間の割合を測定し、システム上のハードウェア スレッドの数を掛けることによって、保護されているクリティカル セクションの使用率をすばやく見積もることができます。

于 2013-06-04T18:27:00.117 に答える