问题标签 [cancellation]

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 投票
1 回答
774 浏览

c - 在用户空间中实现可取消的系统调用

我正在努力在 Linux 上实现 pthread 取消,而不会出现我最近的其他一些问题中讨论的任何“令人不快的行为”(有些人可能会说是错误)。到目前为止,Linux/glibc 取消 pthread 的方法是将其视为不需要内核支持的东西,并且可以在库级别纯粹通过在进行系统调用之前启用异步取消并恢复先前的取消状态来处理系统调用返回后。这至少有两个问题,其中一个非常严重:

  1. 取消可以在系统调用从内核空间返回之后,但在用户空间保存返回值之前进行。如果系统调用分配了资源,这将导致资源泄漏,并且无法使用取消处理程序修补它。
  2. 如果在线程被可取消的系统调用阻塞时处理信号,则整个信号处理程序在启用异步取消的情况下运行。这可能非常危险,因为信号处理程序可能会调用异步信号安全但不异步取消安全的函数。

我解决问题的第一个想法是设置线程处于取消点的标志,而不是启用异步取消,并且当设置此标志时,让取消信号处理程序检查保存的指令指针以查看它是否指向系统调用指令(特定于架构)。如果是这样,这表明系统调用尚未完成,并且会在信号处理程序返回时重新启动,因此我们可以取消。如果没有,我假设系统调用已经返回,并推迟取消。但是,还有一个竞争条件 - 线程可能根本还没有到达系统调用指令,在这种情况下,系统调用可能会阻塞并且永远不会响应取消。另一个小问题是从信号处理程序执行的不可取消的系统调用错误地变成了可取消的,

我正在寻找一种新方法,并寻求有关它的反馈。必须满足的条件:

  • 在系统调用完成之前收到的任何取消请求都必须在系统调用阻塞任何重要的时间间隔之前采取行动,但在由于信号处理程序中断而等待重新启动时则不能。
  • 系统调用完成后收到的任何取消请求都必须推迟到下一个取消点。

我的想法需要对可取消的系统调用包装器进行专门的组装。基本思想是:

  1. 将即将到来的系统调用指令的地址压入堆栈。
  2. 将堆栈指针存储在线程本地存储中。
  3. 从线程本地存储中测试取消标志;如果已设置,则跳转以取消例程。
  4. 进行系统调用。
  5. 清除保存在线程本地存储中的指针。

取消操作将涉及:

  1. 在目标线程的线程本地存储中设置取消标志。
  2. 测试目标线程的线程本地存储中的指针;如果它不为空,则向目标线程发送取消信号。

然后取消信号处理程序将:

  1. 检查保存的堆栈指针(在信号上下文中)是否等于线程本地存储中保存的指针。如果不是,则取消点被信号处理程序中断,现在无事可做。
  2. 检查程序计数器寄存器(保存在信号上下文中)是否小于或等于保存的堆栈指针处保存的地址。如果是这样,这意味着系统调用尚未完成,我们执行取消。

到目前为止,我看到的唯一问题是信号处理程序的第 1 步:如果它决定不采取行动,那么在信号处理程序返回后,线程可能会在系统调用上阻塞,忽略挂起的取消请求。为此,我看到了两个潜在的解决方案:

  1. 在这种情况下,安装一个计时器来将信号传递到特定线程,基本上每毫秒重试一次,直到我们走运为止。
  2. 再次提高取消信号,但从取消信号处理程序返回而不取消屏蔽信号。当中断的信号处理程序返回时,它会自动取消屏蔽,然后我们可以重试。不过,这可能会干扰信号处理程序中取消点的行为。

关于哪种方法最好的任何想法,或者我是否缺少其他更基本的缺陷?

0 投票
1 回答
1084 浏览

c# - 类似于 CancellationTokenSource 和 CancellationToken 模式的暂停线程的模式?

我开始使用 ConcellationTokenSource 和 CancellationToken 在框架 4.0 中提供的协作线程取消模式,我发现它非常有用且简单。

我现在的目的是为我的应用程序提供一个类似的优雅和简单的解决方案,但用于暂停线程而不是取消它们。因为同样在这种情况下,请求与收听暂停命令不同,所以我认为拥有像 PauseTokenSource 和 PauseToken 这样的东西会很好。所以我的第一个问题是,你是否建议这样一种合作暂停模式,或者它是否更好。

如果拥有这样的模式是个好主意,您对如何做到这一点有任何建议或指导吗?目前我认为源应该能够通过 ManualResetEvent 暂停和取消暂停,并且令牌应该具有对源的引用。它遵循初稿,我希望你能给我改进它的建议。

0 投票
1 回答
97 浏览

http - 当用户取消请求时,常见的 Web 服务器会做什么?

对于一个不那么短的请求,用户取消了连接(即在请求完成之前他/她关闭了浏览器),那么服务器端会发生什么?

不过,它应该取决于服务器。但是常见的方法是什么?

有些请求需要相当长的时间才能完成,例如,一个分布式 DBMS 事务,它会将数据提交到不同国家的多个不同服务器。(我知道这在银行应用程序中很常见)

一些请求会向客户端发送大量数据,例如,当用户下载大型附件时。

是否应该在特定超时后取消请求线程?

我的 Web 应用程序是否应该处理用户活动,并自己取消事务,如下所示:

我是不是该?

0 投票
2 回答
9957 浏览

android - Android 回声消除

我正在尝试使用来自android api的AudioRecord类开发音频捕获应用程序,设置音频源MediaRecorder.AudioSource.MIC,应用程序如何工作,但是当我尝试使用回声消除时,设置MediaRecorder.AudioSource。 VOICE_COMMUNICATION 如何来源,当创建 AudioRecorder 对象时,抛出 IllegalArgumentException,但我不知道为什么:

我的代码是:

在我的 android 清单中,我有:

使用权限 android:name="android.permission.RECORD_AUDIO"

也许是因为我使用的是三星 Galaxy Tab p1000,它运行的是 android 2.2?任何的想法?

非常感谢

0 投票
6 回答
17288 浏览

java - 如何取消 SwingWorker 的执行?

目前我有两个 SwingWorker 线程在后台工作。如果发生异常,该方法停止工作,但线程仍在运行。

doInBackground()如果发生异常,我如何停止执行并杀死线程?

this.cancel(true)不要破坏/关闭线程。我怎样才能做到这一点?

我在 Netbeans 的调试中看到了这些线程。

0 投票
6 回答
17431 浏览

java - SwingWorker:何时调用 done 方法?

done()方法的JavadocSwingWorker:

doInBackground 方法完成后在事件调度线程上执行。

我有线索表明在被取消的工人的情况下这是不正确的。
Done在每种情况下(正常终止或取消)都被调用,但是当cancelled没有加入 EDT 时,就像正常终止一样。

done在取消a 的情况下何时调用是否有更精确的分析SwingWorker

澄清:这个问题不是关于如何. 这里假设以正确的方式取消。 这与线程在应该完成时仍在工作无关。cancelSwingWorkerSwingWorker

0 投票
2 回答
877 浏览

android - 获取反馈为什么 Android 应用购买已被取消?

我已经发布了我的第一个 android 应用程序,它与 iPhone 完全不同。

在一些安卓应用购买中,我取消了订单。当我检查订单时,我得到一个理由:电话要求取消。

在屏幕的左上角有一个购买者的电子邮件联系人 - 所以我给那些取消但从未收到反馈的人发送了电子邮件。

这是在这些情况下获得反馈的正确方法吗?如何查明取消的原因?我意识到在某些情况下购买处理存在问题(我让朋友购买我的应用程序) - 这种情况经常发生吗?这是取消的主要原因吗?

非常感谢...

0 投票
1 回答
2497 浏览

c# - 多源任务取消

我目前有一个应用程序,我在其中创建了一系列一个接一个地执行的任务,并带有一个可以中断任务之间执行的取消源(即在安全终止点)。我目前仅在管理类 Disposed 时才使用此取消源,作为一种干净、快速地中止执行的方法。

我现在有一个用例,我想创建一个自动超时来取消任务序列,以防操作员没有及时响应(一些任务等待操作员与物理机制的交互。)在同时,如果管理类是 Disposed,我仍然需要支持取消。我找到了CancellationTokenSource.CreateLinkedTokenSource,这听起来像是我需要的,但我有一些担忧:

  1. 多个任务系列可以并行执行,因此我需要为超时取消创建一个新的 CancellationTokenSource,并为我开始的每个任务系列创建一个关联的链接源。CancellationTokenSource 实现 IDisposable,这意味着我需要保留两个取消源并在最后一个任务完成或任何子任务被取消或故障时处置它们。这似乎相当尴尬,即使有匿名方法闭包的有用魔法(仍然有这些取消源被传递。)

  2. 我还需要防止在计时器到期之前 Disposed 取消源的情况(所以我不取消 Disposed 源。)这是一个潜在的竞争条件,所以我需要添加适当的锁定。这似乎也很尴尬,增加了显着的复杂性(未来的维护成本)并使单元测试更具挑战性(竞争条件很难可靠地诱导。)

我是在走正确的道路还是有更简单的方法来做到这一点?

0 投票
1 回答
972 浏览

linux - 更改另一个线程的 pthread 取消类型?

我想要完成的是一个主线程首先在一个工作线程上尝试一个正常的延迟取消(执行我的目的是一个黑匣子的代码),然后如果线程在超时(pthread_timedjoin_np())后仍在运行,我想做一个异步取消。我遇到的问题pthread_setcanceltype()是只针对调用线程。是否有一些解决方法或黑客可以让我这样做?我想避免使用信号,因为至少在 Linux 下,异步取消似乎仍会执行线程对象的 C++ 析构函数,这对我来说很重要。

0 投票
1 回答
4255 浏览

c# - 将 LINQ 与 CancellationToken 一起使用的正确方法

我正在尝试使用CancellationToken.NET 框架中提供的机制编写一个支持取消的 LINQ 查询。但是,目前还不清楚将取消和 LINQ 结合起来的正确方法是什么。

使用 PLINQ,可以编写:

不幸的是,WithCancellation()它只适用于ParallelEnumerable- 所以它不能与普通的旧 LINQ 查询一起使用。当然,可以使用WithDegreeOfParallelism(1)将并行查询转换为顺序查询 - 但这显然是一个 hack:

我还想避免Task为此操作创建单独的,因为我需要在多个地方执行此操作,并且我需要能够控制此代码在某些情况下运行在哪个线程上。

那么,没有编写我自己的实现WithCancellation()- 是否有替代方案可以实现相同的目标?