2011-08-11 11 views
3

私は複数の異なる相互作用するクライアントを受け入れるC++サーバーを設計しており、ベクトルを使ってそれらのすべてを個別に追跡しています。しかし、非常に多くのスレッドが実行されているため、ベクトルが2つのスレッドによって同時に読み書きされる可能性は非常に低いということがわかりました。ミューテックスや何かを追加するための迅速かつ安全な方法はありますか?そうすれば、別の関数が追加されるまですべての読み込みが完了するまで待つことができますか?そうしないとプロトコルが混乱し、おそらくサーバーがクラッシュすることさえあります。どのようにしてベクターをミューテックスで保護できますか?

すべての読み込みをベクトルにロックするグローバル変数を作成するアイデアはありましたが、スレッドがその変数も相互に排除するように指示できるかどうかはわかりません(つまりboolをfalseに変更せずにチェックします同時に真実であり、機構を無意味にする)。

私はWindows 7(Visual Studio 2010 Pro)を使用しています。すべてのアドバイスをありがとう!

答えて

1

VS2010を使用しているので、Concurrency::concurrent_vectorを使用する必要があります。しかし、このクラスには制限があり、スレッドセーフではありません。 Concurrency::critical_sectionまたはConcurrency::reader_writer_lockを使用できます。 Reader-writerロックは、書き込みより多くの読み取りがある場合に優れたパフォーマンスを発揮します。 Windows native Reader-writerロックを使用することもできますが、Windows Vista以上のみでサポートされています。

5

最も簡単な解決策は、std::vectorconcurrent_vectorに置き換えることです。このクラスはstd::vectorのインタフェースに似ていますが、同時に読み書きするにはスレッドセーフです。

concurrent_vectorクラスはMicrosoft Parallel Patterns Libraryクラスの一部であり、C++標準ライブラリではないため、これによりコードは移植できなくなります。移植性を維持したい場合は、Boost.Mutex(VS2010はstd::mutexをサポートしていないため)を使用して、各スレッドからのベクトルへの排他的アクセスを得る必要があります。同時アクセスを防ぐためにグローバル変数を使用することは無意味です。

関連する問題