Multithreading 高速线程同步

Multithreading 高速线程同步,multithreading,synchronization,Multithreading,Synchronization,我有一个关于线程的问题,我有资格作为一个适度的线程背景 假设我有以下(过于简化的)设计和行为: 对象ObjectA-具有对对象ObjectB的引用和方法MethodA()。 Object ObjectB-具有对ObjectA的引用、元素数组ArrayB和方法MethodB() ObjectA负责实例化ObjectB。ObjectB.ObjectA将指向ObjectB的实例化器 现在,只要满足某些条件,就会在ObjectB.ArrayB中添加一个新元素,并为此元素启动一个新线程,比如ThreadB

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

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

对象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.ObjectA.MethodA()的调用包含在ObjectB.MethodB()中的lock语句中,因此我认为这将确保对MethodA()的调用不会发生冲突,尽管我不能100%确定这一点。但是如果每个ThreadB_x调用ObjectB.MethodB()很多次并且非常快,会发生什么呢?是否有一个调用队列等待ObjectB.ObjectA.MethodA()完成


谢谢。

由于缺乏信息,你的问题很难回答。它取决于在
方法a
中花费的平均时间、每个线程调用此方法的次数、分配给进程的内核数、操作系统调度策略,仅举几个参数

在所有条件相同的情况下,当线程数量朝无穷大增长时,您可以很容易地想象两个线程同时请求访问共享资源的概率将趋于一。这种可能性会随着在共享资源上花费的时间的增加而加快。这种直觉可能就是你提出这个问题的原因

多线程的主要思想是并行化可以有效并发计算的代码,并尽可能避免争用。在你的设置中,如果<代码>方法> <代码>不是纯的,即,如果它可以改变进程的状态,或者用C++语句,如果它不能被编为<代码> const ,那么它就是一个争用的来源(回忆一下,如果函数在它的体中使用纯函数或常量,它只能是纯的)。 处理共享资源的一种方法是使用互斥来保护它,就像您在代码中所做的那样。另一种方法是尝试将其使用转换为异步服务,由一个线程处理,其他线程请求该线程进行计算。实际上,您将得到一个显式的请求队列,但是执行这些请求的线程将可以同时自由地处理其他事情。我们的目标始终是最大化计算时间,而不是每次线程重新调度时都会发生的线程管理时间


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

如果你展示代码而不是描述代码,那就容易多了。“我一点也不知道里面发生了什么。”我的想法正是如此。简单的想法是,由一个对象实例化的多个线程正试图以非常高的速度从另一个对象访问一个方法。代码是巨大的,我过于简化了,上面的描述比实际代码更直观,一个图表会更好。我会弄明白的,我只是想在这里找到新的角度。谢谢稍后我会发布我的发现。看,是这样的。多个线程可以通过多个对象以任何方式调用多个方法(假设没有达到堆栈的限制,就像任何调用序列一样)。这都是关于数据的。如果ObjectA.MethodA()不在ObjectA或其他地方使用任何共享数据,则不需要任何锁。当然,我的意思是“编写任何共享数据”。对不起,我的错。