首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >D:尝试向停止的任务发送消息

D:尝试向停止的任务发送消息
EN

Stack Overflow用户
提问于 2016-11-19 00:15:03
回答 1查看 124关注 0票数 2

当向已停止的vibe.d任务发送消息时,应用程序将得到分段错误。我没有预料到消息会被传递,而是被告知发送失败的尝试(或者至少不会崩溃)。

下面的示例说明了此问题。

代码语言:javascript
复制
import std.stdio;
import core.thread;
import vibe.core.core;
import vibe.core.concurrency;

static this() {
    Task t = runTask({
        writeln("Hi");
    });
    t.join;
    t.send(42);
    writeln("Bye");
}

当运行上面的代码时,输出是:

代码语言:javascript
复制
Hi
Program exited with code -11

..。而不是:

代码语言:javascript
复制
Hi
Bye

呼叫堆栈看起来是这样的。

代码语言:javascript
复制
#0  0x00007ffff6dbd346 in std.concurrency.MessageBox.put(ref std.concurrency.Message) ()
   from /usr/lib64/libphobos2.so.0.71
#1  0x000000000051b0b3 in std.concurrency._send!(int)._send(std.concurrency.MsgType, std.concurrency.Tid, int) (_param_2=42, tid=..., type=<incomplete type>)
    at /opt/dmd-2.071/import/std/concurrency.d:640
#2  0x000000000051b06d in std.concurrency._send!(int)._send(std.concurrency.Tid, int) (
    _param_1=42, tid=...) at /opt/dmd-2.071/import/std/concurrency.d:629
#3  0x000000000051b04b in std.concurrency.send!(int).send(std.concurrency.Tid, int) (
    _param_1=42, tid=...) at /opt/dmd-2.071/import/std/concurrency.d:605
#4  0x000000000051b027 in vibe.core.concurrency.send!(int).send(vibe.core.task.Task, int) (
    _param_1=42, task=...)
    at /home/user/.dub/packages/vibe-d-0.7.30/vibe-d/source/vibe/core/concurrency.d:1239
#5  0x0000000000517b6b in app._staticCtor1() () at /tmp/test/source/app.d:11
...
  • 如何防止分段故障?有检查发送函数吗?如何在vibe.d或phobos2中修补这个问题?
  • 是vibe.d或phobos2的缺陷吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-19 07:58:41

Task有一个您可以使用的running属性。我认为这是预期的行为,因为错误处理通常应该在应用程序级别,而不是库级别。

代码语言:javascript
复制
import std.stdio;
import core.thread;
import vibe.core.core;
import vibe.core.concurrency;

static this() {
    Task t = runTask({
        writeln("Hi");
    });
    t.join;

    if (t.running) {
        t.send(42);
    }

    writeln("Bye");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40687809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档