问题标签 [dispatchsemaphore]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
114 浏览

swift - 嵌套 DispatchSemaphore

我在使用以下模式时遇到问题。我需要同步等待初始异步请求,其中完成块依次调用异步调用列表,其中每个异步调用需要等待前一个异步调用结束才能开始。

下面的代码将一次调用所有嵌套请求,这不是我想要的。

所以,我尝试过的是在 for 循环中添加另一个信号量,但这具有嵌套请求永远不会执行的效果 - 它无限期地等待从未发生过的 semaphore2 信号。我该如何解决?

0 投票
2 回答
1079 浏览

ios - 如何使用带有闭包的 DispatchSemaphore

我有一个看起来像这样的值

这个想法是,在请求 my 时auth headers,如果我的令牌已过期,我将刷新它,然后返回新值。

由于这是一项async操作,因此我尝试使用 a 暂停流程,Semaphore以便在触发完成块后使其继续。

但是,电话没有解决,我不确定为什么。

0 投票
2 回答
2047 浏览

swift - 我可以使用 DispatchSemaphore 来控制主队列上的线程吗?

显然,如果我处理不同的队列,我只能使用 DispatchSemaphore。但是如果我想在同一个队列(在本例中是主队列)上运行异步代码怎么办。

这个片段不起作用,因为异步代码也在等待,因为信号量阻塞了主队列。我可以用信号量做到这一点吗?还是我需要在不同的队列上运行异步代码?

附言。我知道我可以在这个片段中使用同步,而不是异步和信号量。但这只是重现异步调用的示例代码。

0 投票
3 回答
190 浏览

swift - 快速信号量命令行工具项目等待组完成

似乎不要等待小组的结束

我期望 ND p=1000000 t.count=1000000 的输出

如果我取消注释 // semaphoreEND.wait() 我可以得到这个结果

,但实际输出是

结束 p=999871 t.count=999881

其他问题:t.count != p

对于 Group,我希望所有任务都结束。为什么我必须取消注释 // semaphoreEND.wait() ?

谢谢

项目在这里下载:https ://github.com/fredOnGitHub/semaphore_to_modify_1

0 投票
1 回答
1904 浏览

swift - 为什么 DispatchSemaphore.wait() 会阻止这个完成处理程序?

所以我一直在玩 NetworkExtension 来实现玩具 VPN,但我遇到了完成处理程序/异步运行代码的问题。我将引导您完成我的思路/实验,并感谢您在我犯错的领域以及如何解决此问题的任何指示!

这是最小的可重现代码(显然你需要import NetworkExtension):

根据我对信号量和异步代码的理解,我希望打印输出按顺序发生:

但是程序挂在"1 before"。如果我删除该semaphore.wait()行,打印输出按预期的顺序发生:1、3、2 因为闭包稍后运行)。

因此,在使用调试器进行一些挖掘之后,看起来信号量陷阱循环正在阻塞执行。这促使我阅读了一些队列,我发现将其更改为以下工作:

这是有道理的,因为阻塞.wait()调用现在在单独的线程中被异步调用。但是,这个解决方案对我来说并不是我想要的,因为在我的实际实现中,我实际上是从闭包中捕获结果并稍后返回它们,看起来像这样:

显然我不能从async闭包中返回数据,并且将返回移出它会使它失效。此外,添加另一个信号量以使事情同步表现出与之前在链中移动问题相同的问题。

因此,我决定尝试将.loadAllFromPreferences()调用和完成处理程序放在一个async闭包中,并将其他所有内容保留在原始代码片段中:

但是,这不起作用,并且.wait()调用从未通过 - 和以前一样。我假设信号量仍然以某种方式阻塞线程并且不允许执行任何操作,这意味着系统中管理队列的任何内容都没有运行异步块?然而,我在这里抓着稻草,担心我最初的结论可能不正确。

这是我开始超出我的深度的地方,所以我想知道实际发生了什么,以及你建议什么分辨率.loadAllFromPreferences()以同步方式获得结果?

谢谢!

0 投票
2 回答
110 浏览

swift - 基于 QOS 的 DispatchSemaphore 是否阻塞了整个线程池

这是否意味着如果我使用这个信号量来使一个特定的资源块一次只能由一个线程访问,它将阻塞在后台运行的整个线程(或)只阻塞需要资源的线程

0 投票
1 回答
121 浏览

swift - 首次调用信号时如何使用 Dispatch_Sempahore

在 DispatchSemaphore 函数中,可以先调用 Signal() 再调用 Wait() 吗?如果连续调用Signal() N,内部的值是不是变成了N,或者我想知道如果不调用Wait(),多次调用Signal()不会增加值。

0 投票
1 回答
2013 浏览

ios - 信号量等待和信号是否应该总是从单独的队列中调用?

当( https://khanlou.com/2016/04/the-GCD-handbook/ )的一条语句让我感到困惑时,我正在使用 GCD 浏览信号量的正确实现细节:“调用 .wait() 将阻塞线程,直到.signal() 被调用。这意味着 .signal() 必须从不同的线程调用,因为当前线程完全被阻塞了。此外,你不应该从主线程调用 .wait(),只能从后台线程调用。 " 大多数信号量示例通常从同一个队列调用等待和信号,这似乎也可以正常工作。我在这里错过了什么吗?

0 投票
1 回答
588 浏览

ios - Dispatch Semaphore 会无意中死锁吗?

假设我们有一个共享资源,一堆不同的全局队列可以访问,为了这个问题,我们使用 Dispatch Semaphore 来管理该访问。当这些全局队列之一告诉信号量等待时,信号量计数会减少,并且该线程可以访问共享资源。是否有可能在信号量等待时,另一个(不同的)全局队列尝试访问此共享资源,而 GCD 从其池中抓取的线程与为前一个队列(当前正在制作的队列)抓取的线程相同信号量等待)这会死锁这个线程并防止信号量计数重新增加?

0 投票
1 回答
448 浏览

ios - 使用调度组时如何使公共资源线程安全?

我有一个用户类,每次用户打开应用程序时都需要更新

在我的主屏幕 ViewController 中,我有一个使用 3 个 Alamofire 请求从后端获取数据的函数。最后,我将数据保存在 UserDefaults 中。DispatchGroup 是我首先想到的实现这一点。这是代码

但我不清楚我的用户对象的线程安全性。由于它将在三个不同的回调中更新,线程安全在这里会是一个问题吗?如果是,解决问题的最佳方法是什么?我正在考虑使用 DispatchSemaphore。但我不确定这是否是正确的方法。