gpt4 book ai didi

multithreading - 高速线程同步

转载 作者:行者123 更新时间:2023-12-03 13:13:08 25 4
gpt4 key购买 nike

我有一个线程问题,以及我应具备的适度线程背景知识。

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

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

谢谢。

最佳答案

由于缺乏信息,您的问题很难回答。这取决于在methodA中花费的平均时间,每个线程多少次调用此方法,为进程分配了多少个内核,OS调度策略以及其他一些参数。

在所有条件都相等的情况下,当线程数增加到无穷大时,您可以轻松地想象到两个线程同时请求访问共享资源的可能性将趋于一。这种可能性将与在共享资源上花费的时间成比例地增长得更快。这种直觉可能是您提出问题的原因。

多线程的主要思想是使可以并行有效地并行计算的代码并行化,并尽可能避免争用。在您的设置中,如果methodA不纯,即。如果它可以改变进程的状态-或用C++的话来说,如果不能将其设置为const,则它是争用的源(请记住,仅当函数体内使用纯函数或常量时,该函数才可以是纯函数)。

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

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

关于multithreading - 高速线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15197803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com