2016-11-19 78 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的bug嗎?

回答

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'的'Task'時,該怎麼辦? – Phobos

+0

此解決方案線程保存嗎? – Phobos

+0

不幸的是,我看不到任何方式通過api文檔通過tid檢索任務。雖然這可能是我缺乏vibe.d知識。你有沒有辦法保存任務而不是tid?而關於線程安全性,這取決於你如何使用它以及我們在說什麼安全。我們在談論同步智慧,競賽智慧或什麼?一般來說,有很多事情在線程安全中發揮作用。只要你不試圖檢查它是否在其他地方運行,只是發送狀態,它應該工作得很好。 – Bauss

相關問題