Swift Queues/Concurrency 和锁定
Swift Queues/Concurrency and Locking
我通常使用串行队列作为一种锁定机制,以确保一个资源可以被多个不同的线程访问而不会出现问题。但是,我见过其他开发人员使用带有或什至没有信号量的并发队列的情况(在 Linux 上看到 IBM/Swift 使用带信号量的并发队列)。
有没有advantages/disadvantages?我相信仅使用串行队列就可以正确地阻塞资源,而不会浪费时间用于信号量。
另一方面,当 cpu 忙时会发生什么?如果我没记错的话,一个串行队列不一定在同一个thread/samecpu上执行,对吧?
这是我能想到的唯一解释;并发队列将能够在所有可用 threads/cpus 上分担工作负载,确保通过信号量进行线程安全访问。
使用没有信号量的并发队列是不安全的,对吧?
带有信号量的并发队列使您可以更精细地确定哪些条件需要锁定。您可以让大部分功能并行执行,只有互斥区域(临界区域)需要锁定。
然而,这同样可以用并发队列模拟,其关键区域被调度到串行队列,以确保互斥。
I would believe that just using serial queues would correctly block the resource without wasting time for semaphores.
串行队列也需要信号量,因为队列的变化必须同步。然而,它将它藏在地毯下,并保护您免受与手动信号量使用相关的许多容易犯的错误。
Using a concurrent queue without a semaphore would not be safe, right?
没有
我通常使用串行队列作为一种锁定机制,以确保一个资源可以被多个不同的线程访问而不会出现问题。但是,我见过其他开发人员使用带有或什至没有信号量的并发队列的情况(在 Linux 上看到 IBM/Swift 使用带信号量的并发队列)。
有没有advantages/disadvantages?我相信仅使用串行队列就可以正确地阻塞资源,而不会浪费时间用于信号量。
另一方面,当 cpu 忙时会发生什么?如果我没记错的话,一个串行队列不一定在同一个thread/samecpu上执行,对吧?
这是我能想到的唯一解释;并发队列将能够在所有可用 threads/cpus 上分担工作负载,确保通过信号量进行线程安全访问。 使用没有信号量的并发队列是不安全的,对吧?
带有信号量的并发队列使您可以更精细地确定哪些条件需要锁定。您可以让大部分功能并行执行,只有互斥区域(临界区域)需要锁定。
然而,这同样可以用并发队列模拟,其关键区域被调度到串行队列,以确保互斥。
I would believe that just using serial queues would correctly block the resource without wasting time for semaphores.
串行队列也需要信号量,因为队列的变化必须同步。然而,它将它藏在地毯下,并保护您免受与手动信号量使用相关的许多容易犯的错误。
Using a concurrent queue without a semaphore would not be safe, right?
没有