2

停止した 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 のバグでしょうか?
4

1 に答える 1

0

Taskrunning使用できるプロパティがあります。エラー処理は通常、ライブラリレベルではなくアプリケーションレベルで行う必要があるため、これは意図された動作だと思います。

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");
}
于 2016-11-19T07:58:41.050 に答える