【发布时间】:2015-06-30 11:00:44
【问题描述】:
我有以下代码:
func foo() {
var sum = 0
var pendingElements = 10
for i in 0 ..< 10 {
proccessElementAsync(i) { value in
sum += value
pendingElements--
if pendingElements == 0 {
println(sum)
}
}
}
}
在这种情况下,函数proccessElementAsync,顾名思义,异步处理其输入参数,并在完成时调用其相应的完成处理程序。
这种方法的不便之处在于,由于变量 pendingElements 是通过多个线程访问的,那么语句 if pendingElements == 0 可能永远不会具有值 true。
在 C# 中,我们可以执行以下操作:
Object lockObject = new Object();
...
lock (lockObject) {
pendingElements--;
if (pendingElements == 0) {
Console.WriteLine(sum);
}
}
这确保了这个变量只能同时被一个线程访问。有什么方法可以在 Swift 中获得相同的行为?
【问题讨论】:
-
旁注:在 C# 中
lock(someIntValue)不会做任何与您试图实现的目标很接近的事情...在 C# 中,请考虑遵循创建仅用于锁定的特殊对象的默认准则...跨度> -
在 C# 中我们可以做到
Interlocked.Decrement -
@AlexeiLevenkov 我已经更新了 c# 代码,我认为我对它太不正式了。对此感到抱歉
-
@ReynaldoAguilar - 现在看起来不错。一般来说,请记住,读者不可能区分“非正式/快速编写的示例”和“对概念的完全误解”。因此,显示正确的代码可以显着提高回答实际解决您正在寻找的内容的机会。
标签: swift multithreading