【发布时间】:2018-08-28 04:43:21
【问题描述】:
我是 swift 新手,我正在尝试多线程,这个概念在 swift 中似乎并不出名。基于 java 的 synchronizedimplementation 的 this 示例,我尝试根据 another SO 帖子上为 swift 提供的示例对 swift 执行相同的操作。这是我的实现:
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
public class TestThread {
var name : String;
var theDemo : TheDemo;
init(_ name : String, _ theDemo : TheDemo) {
self.theDemo = theDemo;
self.name = name;
run()
}
public func run() {
DispatchQueue.global(qos: .background).async {
DispatchQueue.main.async {
self.theDemo.testSynced(self.name)
}
}
}
}
public class TheDemo {
private func synced(_ lock : Any, _ name : String, _ closure : (_ name : String) -> ()){
objc_sync_enter(lock)
defer { objc_sync_exit(lock) }
closure(name)
}
public func testSynced(_ name : String){
synced(self, name, test)
}
public func test(_ name : String) {
for i in 0..<4 {
let str = "\(name) :: \(i)"
let theDeadline = DispatchTime.now() + .seconds(i/2)
DispatchQueue.main.asyncAfter(deadline: theDeadline, execute: {
print(str)
})
}
}
}
var theDemo = TheDemo()
TestThread("THREAD 1", theDemo)
TestThread("THREAD 2", theDemo)
TestThread("THREAD 3", theDemo)
TestThread("THREAD 4", theDemo)
当我在操场上运行上面的代码时,我得到的结果如下所示
THREAD 1 :: 0
THREAD 1 :: 1
THREAD 2 :: 0
THREAD 2 :: 1
THREAD 3 :: 0
THREAD 3 :: 1
THREAD 4 :: 0
THREAD 4 :: 1
THREAD 1 :: 2
THREAD 1 :: 3
THREAD 2 :: 2
THREAD 2 :: 3
THREAD 3 :: 2
THREAD 3 :: 3
THREAD 4 :: 2
THREAD 4 :: 3
但我期待的结果如下所示。
THREAD 1 :: 0
THREAD 1 :: 1
THREAD 1 :: 2
THREAD 1 :: 3
THREAD 2 :: 0
THREAD 2 :: 1
THREAD 2 :: 2
THREAD 2 :: 3
THREAD 3 :: 0
THREAD 3 :: 1
THREAD 3 :: 2
THREAD 3 :: 3
THREAD 4 :: 0
THREAD 4 :: 1
THREAD 4 :: 2
THREAD 4 :: 3
我想了解我做错了什么。考虑到同步和快速线程的概念,我是否也将期望设定在正确的道路上。我很感激帮助。谢谢。
编辑
由于我认为我被误解了,所以我想多解释一下我想做的事情。我基本上想要实现的与我在代码中写的有点不同。这是一个简化版本。如果synchronized 在一个简单的示例中工作,我想测试它,然后我想在另一个项目中使用它。我正在将一个为 android 编写的项目翻译为 ios。在 java 多线程中,我使用 synchronized 以便一次只有一个线程可以使用该函数。假设有多个线程可以处理的变量或函数。当我把 synchronized 放在函数名或变量名之前,线程就会有锁。现在在我的项目中,我有几个线程,它们来来去去,基于一些传感器输入——在它们死之前,它们使用一个公共共享函数。他们随时可能来。出于几个原因,我们设置了公共函数synchronized,这样就没有两个线程同时进入该函数。因此,当我翻译代码时,我迅速寻找类似的内容,并找到了与该问题相关的链接之一。我试图使用它——它对我不起作用。犯错是人之常情——我可能在某个地方犯了错误。但是我已经根据我的时间表花时间阅读了。 (我部分说多线程在swift中并不是很有名,因为我读过一些地方,例如this)
【问题讨论】:
-
请搜索“异步”。这已经在这里解释了很多很多次。
-
我的问题是关于关键字同步和预期的输出。我根据我在 stackoverflow 中找到的建议实现了,结果与 java 的不同。请不要对我投反对票 - 我宁愿删除这个问题。谢谢。
-
“我宁愿删除这个问题”然后删除它。
-
我尝试添加更多描述。感谢您的回答。
-
“出于多种原因,我们将通用函数设置为同步,以便没有两个线程同时进入该函数。”美好的。所以看看我的回答:在 Cocoa 和 GCD 中,我们使用串行队列来完成同样的事情。串行队列是一种锁定形式——一种更好的形式。
标签: swift multithreading concurrency