高速线程同步

时间:2013-03-04 08:59:59

标签: multithreading synchronization

我有一个线程问题,我有资格作为适度的线程背景。

假设我有以下(过度简化的)设计和行为:

Object ObjectA - 具有对象ObjectB的引用和方法MethodA()。 Object ObjectB - 引用ObjectA,元素数组ArrayB和方法MethodB()。

ObjectA负责实例化ObjectB。 ObjectB.ObjectA将指向ObjectB的实例化器。

现在,只要满足某些条件,就会在ObjectB.ArrayB中添加一个新元素,并为该元素启动一个新线程,比如ThreadB_x,其中x从1变为ObjectB.ArrayB.Length。每个这样的线程调用ObjectB.MethodB()来传递一些数据,然后调用ObjectB.ObjectA.MethodA()进行数据处理。

因此,多个线程调用相同的方法ObjectB.MethodB(),并且它们很可能在同一时间执行。 MethodB中有很多代码可以创建和初始化新对象,所以我认为那里没有问题。但是这个方法调用了ObjectB.ObjectA.MethodA(),我对那里发生的事情一无所知。根据我得到的结果,显然没什么不对,但我想确定这一点。

现在,我在ObjectB.MethodB()内的一个锁语句中包含对ObjectB.ObjectA.MethodA()的调用,所以我认为这将确保MethodA()的调用没有冲突,尽管我不是百分百肯定的。但是如果每个ThreadB_x多次调用ObjectB.MethodB()并且速度非常快,会发生什么?我是否有一个等待ObjectB.ObjectA.MethodA()完成的调用队列?

感谢。

1 个答案:

答案 0 :(得分:0)

由于缺乏信息,您的问题很难回答。它取决于在methodA中花费的平均时间,每个线程调用此方法的次数,为进程分配的内核数,操作系统调度策略,以命名一些参数。

所有事情都是平等的,当线程数增长到无穷大时,您可以很容易地想象两个线程同时请求访问共享资源的概率将趋于一。该概率将与共享资源上花费的时间量成比例地增长得更快。这种直觉可能是你提问的原因。

多线程的主要思想是并行化可以同时有效计算的代码,并尽可能避免争用。在您的设置中,如果methodA不纯,即。如果它可能改变进程的状态 - 或者用C ++的说法,如果它不能成为const,那么它就是争用的来源(回想一下,如果函数只使用纯函数或常量,那么函数只能是纯的它的身体)。

处理共享资源的一种方法是使用互斥锁保护它,就像在代码中一样。另一种方法是尝试将其使用转换为异步服务,一个线程处理它,另一个请求该线程进行计算。实际上,您最终会得到一个显式的请求队列,但执行这些请求的线程可以在同一时间自由地处理其他事情。目标始终是最大化计算时间,而不是每次重新安排线程时发生的线程管理时间。

当然,并非总是可以这样做,例如。当methodA的结果属于强有序的计算链时。