所以,我有一个ob ob对象,每个对象有几个字段,包括一个c-array,它们在“Update()”方法中被修改。现在我创建了几个线程,每个线程都更新了这些对象的一部分。据我所知,在调用更新函数之前调用lock()是没用的,因为这实际上会导致按顺序调用更新,就像没有多线程一样。现在,对象有指针,相互交叉引用。每次修改任何字段时,还是在特定操作之前(例如删除,重新初始化数组等),我是否需要调用锁?
答案 0 :(得分:2)
每次修改任何字段时,还是在特定操作之前(如删除,重新初始化数组等),我是否需要调用锁?
都不是。您甚至需要锁定才能读取,以确保另一个线程不是修改您正在读取的数据的一部分。您可能想要使用多个读取器/一个写入器锁。我建议你先从一个锁(无论是一个简单的互斥锁还是更复杂的多读/写锁)开始,然后让代码正常工作,这样你就可以配置它,看看你是否真的需要更细粒度的锁定,然后你将有更多的经验和对如何管理它的选项和建议的理解。
如果你确实需要细粒度锁定,那么诀窍是考虑逻辑上锁定的位置 - 例如 - 每个对象可能有一个。然后,您需要了解避免死锁的技巧。你也应该做一些背景阅读。
答案 1 :(得分:1)
这取决于您想要进行的数据更改的后果。例如,如果每个线程更改定义良好的数据子块和,则每个子块完全独立于所有其他子块,那么每个子块具有互斥量可能是有意义的。
这将允许一个线程处理一组子块,而另一个线程处理不同的子集来处理。
线程在没有获得互斥锁的情况下进行更改最多会导致不一致......
如果数据和处理不能以这种方式细分,那么您可能必须开始考虑如何并行处理整个对象,即采用较粗粒度和每个对象一个互斥。这可能更有可能 - 不同的对象应该彼此独立,因此理论上应该可以并行处理它们的数据。
然而,不可避免的事实是,某些计算机作业需要快速的单线程性能。因为那个人开始认真地需要正确的超级计算机,也许还需要一些快速的长管道。