我有一个函数,为了论证,有两行代码。
Line A
Line B
这两行都是对第三方Web服务的调用,可以完成一些工作。似乎B行上的服务调用取决于在调用A行之后立即(按时间)调用。这一切在非线程环境中工作正常但我的应用程序正在线程批量(可能是100)这些调用
我认为,这种线程的问题在于线程之间的上下文切换导致在线路A上的呼叫和线路B上的呼叫之间经过足够的时间(非常少的时间),这导致了在B行调用以抛出自定义soap异常。
我对线程的了解并没有真正扩展到这样的情况。无论如何要确保线路B上的呼叫在线路A上的呼叫之后立即发生而不发生线程上下文切换吗?
答案 0 :(得分:1)
如果确实是这种情况,(并且我怀疑你错了,但事实并非如此),这些调用之间的小延迟会导致系统失败,那么你就会遇到大麻烦。正如@Henk所说,硬件中断(驱动程序)上的OS条目可能发生在A和B之间,增加了延迟。如果驱动程序中断使另一个线程准备就绪,则此时可能会抢占A / B并产生更大的延迟。如果A和B是复杂的Web服务调用,那么服务内部进行许多系统调用几乎是不可避免的,这使得操作系统有更多机会引入延迟/抢占。即使您的A和B没有进行明确的系统调用,页面错误也可能会引入一个长时间的延迟,而代码/数据/堆栈/无论是否被分页。
非常努力地找到问题的其他解决方案,而不是试图确保B'立即'跟随A - 我希望你能找到一个!
RGDS, 马丁
答案 1 :(得分:0)
如果您需要一起调用这些行,那么您可以锁定它们,这意味着在完成之前没有其他内容会进入此部分:
lock(lck)
{
Line A
Line B
}
然而,如果这是所有100个线程正在做的话,这可能会导致问题 - 你失去了并行性。事实上,无论你做什么,如果这是一般要求,你将失去一定程度的并行性。