我有一个可以在多个线程上访问的单例,它的每个数组都应该有一个单独的调度队列吗?

I have a singleton that can be accessed on multiple threads, should each of its array have a separate dispatch queue?

假设我有一个照顾水果的单身人士,FruitManager。它内部有 3 个数组,favoriteApplesfavoritePeachesfavoriteOranges。可以在这些数组可以 read/written 到的任何线程上访问单例。

通常我会在这里使用 DispatchQueue 来帮助解决 Reader/Writer 问题,我允许并发读取但使用调度屏障块来确保只有一个写入操作发生在一次。

我的问题是,我是否应该为 3 个数组(总共 3 个队列)中的每一个设置一个 DispatchQueue?或者整个 class 只有 1 个调度队列,如果正在写入 favoriteApples,将有效锁定对 favoritePeaches 的写入?

回答一个 reader-writer vs 每个集合一个,这可能并不重要。但有几点需要注意:

  1. 只有一个 reader-writer 的唯一潜在问题是一个集合上的一个块将阻止所有这些。因此,如果您在一个或多个集合的同步中做任何计算上昂贵的事情,您可能希望每个集合都有一个单独的 reader-writer,这样它就不会对其他集合的性能产生不利影响。

    话又说回来,无论如何,你永远不想用 reader-writer 模式做任何计算上昂贵的事情。 “writer”是一个异步屏障,这意味着它会阻塞任何后续的“readers”,直到写入完成。如果从主队列访问 readers,这将对主线程(或从您正在阅读的任何地方)的性能产生不利影响。

    所以,如果它在计算上很昂贵,无论如何你都不会使用 reader-writer。 (你可能想要一个异步获取方法,让你摆脱 reader-writer 模式。)如果你没有做任何计算上昂贵的事情,那么使用单独的 reader- 几乎没有好处每个合集的作者。

  2. 设置多个 reader-writers 很好,如果三个集合是完全独立的(如您的简单示例所示)。但是,如果这三个集合之间存在任何依赖关系(例如,您正在读取一个集合以更新另一个集合),则代码可能会很快变得一团糟。

所以,归根结底,为了简单起见,我倾向于一个 reader-writer 来写整个 class。但是如果你已经有一个在内部使用 reader-writer(或任何同步机制)的线程安全集合 class,那么在这个 [=31] 中使用它可能没问题=] 具有这三个集合(只要您的三个集合之间没有任何毛茸茸的依赖关系)。


不用说,以上内容适用于在多个线程之间共享的任何对象,而不仅仅是单例。您碰巧使用单例的事实与手头的问题无关。