std.container.dlist
を使用してキュータイプを作成するのは簡単です。キューを使用してスレッド間で通信する
私は複数のスレッドを持っていますが、メッセージを渡す(https://tour.dlang.org/tour/en/multithreading/message-passing)ではなくキューと通信したいと考えています。私が理解しているように、メッセージはコード内の特定のポイントで常にデータを受け取るように設計されています。受信スレッドは、期待されるデータが受信されるまでブロックされます。
(EDIT:私はreceiveTimeoutについて通知されましたが、タイムアウトがなく、ちょうどこの場合は本当により適切です(多分0のタイムアウトですか?)また、複数の場合にメッセージAPIが何をするかわかりませんメッセージは、私はそれをプレイする必要があります。いずれかが受信されているすべての前に送信されます。)
void main() {
spawn(&worker, thisTid);
// This line will block until the expected message is received.
receive (
(string message) {
writeln("Received the message: ", text);
},
)
}
私が必要としていますどのようないくつかがある場合は、単にデータを受信することです。このような何か:
void main() {
Queue!string queue// custom `Queue` type based on DList
spawn(&worker, queue);
while (true) {
// Go through any messages (while consuming `queue`)
for (string message; queue) {
writeln("Received a message: ", text);
}
// Do other stuff
}
}
私はshared
変数(https://tour.dlang.org/tour/en/multithreading/synchronization-sharing)を使用して試してみましたが、DMDがいることを不平を言っている「可変スレッドローカルデータへのエイリアスが許可されていません。」それに応じて、いくつかのエラーが発生します。
これはDでどのように行われますか?あるいは、この種の通信を行うためにメッセージを使用する方法はありますか?
これは本当に私が必要とするものではありませんが、私は 'receiveTimeout'を逃しました。私が他の何かを働かせることができなければ、おそらく 'receiveTimeout'を使って私が必要なことをすることができます。 –
receiveTimoutに-1などの負の値を指定すると、必要な処理が実行されます。参照:https://stackoverflow.com/a/31624806/2026276 – Bauss