【问题标题】:vibe.d: Try to send a Message to a stopped Taskvibe.d:尝试向已停止的任务发送消息
【发布时间】:2016-11-19 00:15:03
【问题描述】:

向已停止的 vibe.d 任务发送消息时,应用程序出现分段错误。我没想到消息会被传递,但会收到有关发送尝试失败的通知(或至少不会崩溃)。

下面的例子说明了这个问题。

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");
}

运行上述代码时,输​​出为:

Hi
Program exited with code -11

...而不是:

Hi
Bye

调用堆栈如下所示。

#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 的 bug?

【问题讨论】:

    标签: d phobos vibed


    【解决方案1】:

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

    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");
    }
    

    【讨论】:

    • 当我只有TidTask 时,您是否也知道该怎么做?
    • 不幸的是,我看不到通过 api 文档通过 tid 检索任务的任何方法。不过,这可能是我缺乏 vibe.d 知识。你有没有办法保存任务而不是tid?关于线程安全,它真的取决于你如何使用它以及我们所说的安全性。我们是在谈论同步、竞争条件还是什么?一般来说,有很多事情在线程安全中发挥作用。只要您不尝试检查它是否在其他地方运行并且只是发送状态,它应该可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2019-04-07
    • 1970-01-01
    • 2020-08-20
    • 2015-10-04
    • 2012-09-10
    • 2020-04-14
    相关资源
    最近更新 更多