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