Tag: 信号量

Swift S中的信号量之美

在这个故事中,我们将执行以下操作 : 了解什么是信号量 了解信号量如何工作 实施并解释2个示例 开始吧 信号量使我们能够控制多个线程对共享资源的访问。 为了简单起见,让我们考虑以下现实情况: 一位父亲和三个孩子坐在家里,然后掏出iPad … 孩子2 :我想玩iPad !!! 小孩1 :不!,我想先玩… 孩子3 :Ipad! iPad! iPad! *掌声* 父亲 :好的,孩子2,因为您首先问过,并且目前没有人使用iPad,请拿走它,但是一旦完成,请告诉我。 其他孩子,请耐心等待。 孩子2: (5分钟后)我做完父亲了。 父亲:孩子1,有iPad,请在完成后告诉我。 孩子1: (5分钟后)我做父亲了。 父亲:孩子3,有iPad,请在完成后告诉我。 孩子3: (5分钟后)我做完父亲了。 在上述方案中,父亲是信号量,iPad是共享资源,孩子是线程。 注意父亲如何确保一次只有一个孩子使用iPad。 如果将此与编程进行比较,则一次只能有一个线程访问共享资源。 另外,请注意使用顺序,首先询问的是谁(FIFO)。 提示 :共享资源可以表示变量,也可以表示工作,例如从url下载图像,从数据库读取等等。 如果父亲只是把iPad给孩子们怎么办? 飞机飞行到可能损坏的iPad😖的地步。 如果将其与编程进行比较,则多个线程会尝试同时访问同一资源,并且没有任何阻止。 这种行为可能导致争用情况,崩溃,并且显然,我们的代码将不是线程安全的。 线程安全:可以从多个线程安全地调用而不会引起任何问题的代码。

在Swift中同步异步

我确定您已经遇到过异步任务,并且必须使它们同步执行的情况,因为它们之间存在依赖关系。 想象一下安排会议的场景 调用一些登录API以获得令牌 获取特定时间的可用人员列表 得到一个人的细节 与有空人员开会 在您大声疾呼这只是API的不良示例之前,请放心,我同意您的观点。 但这是我们现实太多次了。 但是,有一个开箱即用的解决方案: 在队列上 使用 操作 和链接相关任务! 这听起来像是我们要实现的教科书示例。 让我们使用操作并使其起作用: 我们可以看到我们有一个Operation SumOfTwoAsyncOperations 。 我们可以清楚地看到它的业务逻辑在全局后线程队列上的异步调用中执行业务逻辑。 这里我们有一个函数sumOfTwoAsyncOperations ,它接受4个数字,并在operation1添加number1和number2在operation1添加number3和number4 。 我们可以看到,我们还创建了BlankOperation类型的“虚拟” operation3 BlankOperation ,其唯一目的是确认最后执行的操作,该operation3应为operation3并将消息打印到控制台中。 因此,如果现在调用此函数: 使用参数4和5,那么我们期望在控制台中获得以下输出: 运算1之和4 + 4 = 8 运算2总和5 + 5 = 10 操作2完成! 好吧..不! 我们得到这个: 操作2完成! 运算2总和5 + 5 = 10 运算1之和4 + 4 = 8 我们得到相反的顺序,但是即使那样也不能保证。 实际上,我们无法真正控制结果。 如果我们还记得本文中的讨论,则提到了依赖性管理,而其他一些操作并非完全免费或完全免费。 […]