2012-04-08 19 views
0

私はMessengerライブラリを作成しましたが、スレッドセーフであるため、スレッド間で心配なしに共有できます。これは主にMonitorクラスを使用して実現します。2つのスレッドが同じメソッドを呼び出すときのスレッドの同期についての混乱

ログアウトルーチンは、ソケットなどをシャットダウンする前にトランザクションが発生するのを待つために時間がかかることがあります。非同期で、Begin/Endメソッドがありますが、この例ではそれが同期しているふりをする。

2つのスレッドがすぐにログアウトを呼び出すとどうなりますか? 2番目のスレッドでは何をすべきですか?

現在、最初のログアウトが完了してからAlreadyLoggedOutExceptionがスローされるまで(Monitor.Waitを使用して最初のスレッドからPulseを待つ)ブロックします。

私は、Logoutが呼び出されても既にログアウトが行われている場合に、LogoutInProgress例外がスローされているとおもしろいです。

両方に長所と短所があるようですが、私は他の人が最もよく考えるものを知りたいと思います。

答えて

2

あなたが言及した2つの中で最良の選択肢は、あなたのライブラリの振る舞いに依存します。

私は消費者に例外を投げず、実際のログアウトが完了したら両方のスレッドの終了ログアウト非同期イベント/メソッドを起動します。これを達成するために使用する必要がある同期プリミティブは、メソッド/ライブラリの設計によって異なります。あなたが言及したBegin Endメソッドの詳細を共有していると、私はより良い提案をすることができます。

このオプションは、プログラムするのが簡単です。

+0

非同期側は重要ではありません。どのような例外もなくログアウトが行われた後、両方のログアウトメソッドがただ返す(void)と言っていることは何ですか? – NoPyGod

+0

両方が同じクライアントでログアウトしようとしていて、操作が冪等であれば、例外をスローすることに意味はありません。 –

+0

例外のあるロジックは感謝しています。しかし、実際にログアウトが完了するまで、両方のログアウト・コールが「ブロック」する必要があると本当に信じていますか?理論的には、第1のログアウトはある時点で成功することが保証されているので、私は第2のログアウトから戻ることができます。私が見ている問題は、発信者に、実際にまだ起こっているときにログアウトが完了しているという錯覚を与えるということです。 – NoPyGod

0

第3のオプションがあります。ログアウトしようとしている2番目のスレッドが、ログアウトが既に発生していて何もしていないことを検出できました。 「ログアウト」の契約が「ユーザーがログアウトしていることを確認する」または「スローする」のいずれかの場合は、ログアウトの冪等を実際に作成する必要があります。

しかし、論理的なエラーであるため、複数のログアウトを許容できない場合は、何らかの理由で例外をスローする必要があります。

関連する問題