2016-11-19 2 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'' Task'? – Phobos

+0

Является ли это проблемой для решения проблемы? – Phobos

+0

К сожалению, я не вижу способа получить задание посредством tid через документацию api. Это может быть моя нехватка знаний vibe.d. Нет ли способа сохранить задачу, а не tid? И о потокобезопасности это действительно зависит от того, как вы его используете и в какой безопасности мы говорим. Мы говорим о синхронизации, мудрый, состояние гонки или что? Есть много вещей, которые играют роль в обеспечении безопасности потоков в целом. Он должен работать нормально, пока вы не пытаетесь проверить, работает ли он в другом месте и просто отправляет состояние. – Bauss

Смежные вопросы