1
A
回答
0
好吧,这里是工作示例(归功于@KenThomases ...)
import Dispatch
let semaphore = DispatchSemaphore(value: 1)
let printQueue = DispatchQueue(label: "print queue")
let group = DispatchGroup()
func longRuningTask(i: Int) {
printQueue.async(group: group) {
print(i,"GREEN semaphore")
}
usleep(1000) // cca 1 milisecond
printQueue.async(group: group) {
print(i,"job done")
}
}
func shortRuningTask(i: Int) {
group.enter()
guard semaphore.wait(timeout: .now() + 0.001) == .success else { // wait for cca 1 milisecond from now
printQueue.async(group: group) {
print(i,"RED semaphore, job not done")
}
group.leave()
return
}
longRuningTask(i: i)
semaphore.signal()
group.leave()
}
printQueue.async(group: group) {
print("running")
}
DispatchQueue.concurrentPerform(iterations: 10, execute: shortRuningTask)
group.wait()
print("all done")
及其打印
running
0 GREEN semaphore
2 RED semaphore, job not done
1 RED semaphore, job not done
3 RED semaphore, job not done
0 job done
4 GREEN semaphore
5 RED semaphore, job not done
6 RED semaphore, job not done
7 RED semaphore, job not done
4 job done
8 GREEN semaphore
9 RED semaphore, job not done
8 job done
all done
Program ended with exit code: 0
相关问题
- 1. C++部分互斥/临界区段锁
- 2. 互斥体和临界区之间的边界是什么?
- 3. 锁,互斥和临界区之间的区别
- 4. Windows上的互斥锁,临界区等的代价
- 5. C++中互斥锁和临界区之间的性能差异
- 6. 线程同步 - 临界区或互斥锁?
- 7. 临界区
- 8. 互斥或不互斥互斥?
- 9. 我可以使用互锁操作更新多个值以避免锁定临界区/互斥量吗?
- 10. 与sephamores临界区
- 11. 离开临界区
- 12. 实现互斥确保有界等待
- 13. 互斥
- 14. 互斥
- 15. 实现Qt临界区域
- 16. 临界区,并在C++
- 17. 临界区初始化(C++)
- 18. Java中互斥线程的互斥量?
- 19. 互斥锁与pthread_join之间的区别
- 20. 互斥和同步的区别?
- 21. 为什么互斥体不需要互斥体(并且该互斥体需要互斥体...)
- 22. 使NSOperations互斥
- 23. 互斥理解
- 24. Posix Pthread互斥
- 25. 与互斥
- 26. 互斥对象
- 27. Java互斥
- 28. 互斥并行
- 29. 使用互斥
- 30. 互斥问题
您可以使用一个信号量。对于“尝试锁定”操作,使用DISPATCH_TIME_NOW调用dispatch_semaphore_wait()作为timeout参数。如果它返回非零值,那么超时,意味着别的东西持有锁,你应该跳过你的操作。 –
dispatch_semaphore_wait()增加信号量计数器+1谁会减少这个比? – ObranS
'dispatch_semaphore_wait()'尝试**减少信号量计数器。 'dispatch_semaphore_wait()'类似于锁定锁; 'dispatch_semaphore_signal()'类似于解锁它。信号量将从1开始,表示它已解锁,并且一个客户端可以一次锁定它。 –