2016-11-19 4 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

'작업'의 '뚜껑'만 가지고있을 때 수행 할 작업이 있습니까? – Phobos

+0

이 솔루션 스레드가 저장됩니까? – Phobos

+0

아쉽게도 API 문서를 통해 tid로 작업을 검색 할 수있는 방법이 없습니다. 그것은 나의 지식이 부족한 vibe.d 지식 일 수 있습니다. 당신이 그 일을 구제 할 수있는 방법이 없습니까? 그리고 쓰레드 안전성에 관해서는 쓰레드를 사용하는 방법과 우리가 말하는 안전성에 달려 있습니다. 우리는 동기화와 현명한 경쟁 조건을 이야기하고 있습니까? 일반적으로 thread-safety에서 많은 역할을합니다. 그것이 다른 곳에서 돌아가고 있는지를 확인하지 않고 상태를 전송하는 한 괜찮습니다. – Bauss