2016-11-19 12 views
2

停止したvibe.dタスクにメッセージを送信すると、アプリケーションはセグメント化エラーを取得します。私はメッセージが届くとは思っていませんでしたが、失敗した送信の試みについて通知を受けました(または少なくともクラッシュしないように)。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のバグですか?

答えて

0

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

あなたは「タスク」の「Tid」しか持っていないときに何をすればよいか考えていますか? – Phobos

+0

このソリューションスレッドは保存されますか? – Phobos

+0

残念ながら、私はtidによってAPIのドキュメントを通してタスクを取得する方法を見ることができません。それは私のvibe.d知識の欠如かもしれません。それはあなたの仕事ではなく、仕事を保存する方法はありますか?糸の安全性については、実際の使用方法や話している安全性に大きく依存します。私たちは同期的に、競争条件を賢明に、あるいは何を話していますか?一般的にスレッドセーフで重要な役割を果たすことはたくさんあります。他の場所で動作しているかどうかを確認せずに状態を送信するだけで、正常に動作するはずです。 – Bauss

関連する問題