2012-04-08 131 views
0

我创建了一个Messenger库,并且使线程安全,因此可以在线程之间共享,而不用担心。我主要使用Monitor类来实现这一点。两个线程调用同一个方法时线程同步的困惑

我有一个注销例程,可能需要一些时间才能完成,因为它试图在它关闭套接字之前等待发生的事务。它是异步的并具有Begin/End方法,但对于此示例,我们只是假装它是同步的。

如果两个线程调用Logout,一个接一个地怎么办?我应该如何处理第二个线程?

当前我阻止(使用Monitor.Wait等待来自第一个线程的脉冲),直到第一个注销完成,然后抛出AlreadyLoggedOutException。

我也玩过一个LogoutInProgress异常,如果注销被调用但已经发生注入。

两者似乎都有优点和缺点,但我想知道其他人认为最好的。

回答

2

你提到的两个中最好的选择是什么,取决于你希望你的图书馆如何表现。

我不会抛出异常给使用者,只是在实际的注销完成时为两个线程启动结束注销异步事件/方法。您应该使用哪种同步原语来实现这一点取决于您的方法/库的设计。也许如果你分享了你提到的Begin Begin方法的更多细节,我将能够提出更好的建议。

这个选项会比较容易编程。

+0

它的异步方面并不重要。你说什么Logout方法应该只是返回(无效)他们两人后注销发生没有任何异常? – NoPyGod 2012-04-08 23:04:41

+0

如果他们两个都打算注销同一个客户端,并且操作是幂等的,那么抛出异常没有意义。 – 2012-04-08 23:07:52

+0

有例外的逻辑很有意义,谢谢。但是你真的相信,注销电话应该“阻止”,直到实际注销完成?理论上,我可以从第二次注销返回,因为第一次注销在某个时刻保证成功。我看到的问题是,它会给调用者一个错误的注销完成时,事实上它仍在发生。 – NoPyGod 2012-04-08 23:25:49

0

还有第三种选择:尝试登出的第二个线程可以检测到注销已经发生并且什么都不做。如果“注销”合同是“确保用户注销或丢弃”,那么您确实应该使注销成为幂等。

但是,如果你不能容忍多次注销,因为这会是一个逻辑错误,你应该抛出一个异常。