我正在解决一个涉及实施 Google 的 MapReduce 的家庭作业问题,我需要跟踪任务列表是否已完成。多个线程需要能够检查任务是否完成或将未完成的任务设置为已完成状态。我现在使数组线程安全的方法是创建一个原子布尔值数组,以允许线程安全写入和读取,而无需锁定整个数组。
我的问题是:
我将数组实现为普通的原子变量数组,并且它有效,但我想知道是否以及何时最好锁定整个数组。
如果锁定整个切片,则可以写入切片其他部分的 goroutine 将不得不等待。因此,锁定切片的各个元素将实现更多并发性。
一般来说,只有在修改切片变量时才需要锁定整个切片,而不是在修改切片的各个元素时。例如,如果您有一个遍历切片的所有元素的 for 循环,则应该锁定该切片,而不是逐个锁定单个元素。如果您遇到这种情况,那么在处理单个元素时锁定数组可能更有意义,因为否则您将必须获取两个锁以防止 for 循环 goroutine 和与之一起使用的 goroutine 之间出现竞争条件个别元素。
要查看是否有不同的方法来解决同一问题,我们需要有关该问题的更多信息。你真的需要每个元素都有一个互斥体吗?有多少个 goroutine 使用单个元素?他们可以改用渠道吗?