Multithreading 使用队列在D中的线程之间进行通信
在D中,使用std.container.dlist创建队列类型非常简单 我希望有多个线程,但让它们与队列通信,而不是与消息传递通信。据我所知,这些消息被设计为总是在代码中的特定点接收数据;接收线程将阻塞,直到收到预期的数据 编辑:我被告知receiveTimeout,但在这种情况下,只有一个无超时和一个检查更合适,可能是0?的超时?。此外,如果在接收任何消息之前发送多条消息,我也不确定消息API会做什么。我得玩这个Multithreading 使用队列在D中的线程之间进行通信,multithreading,d,Multithreading,D,在D中,使用std.container.dlist创建队列类型非常简单 我希望有多个线程,但让它们与队列通信,而不是与消息传递通信。据我所知,这些消息被设计为总是在代码中的特定点接收数据;接收线程将阻塞,直到收到预期的数据 编辑:我被告知receiveTimeout,但在这种情况下,只有一个无超时和一个检查更合适,可能是0?的超时?。此外,如果在接收任何消息之前发送多条消息,我也不确定消息API会做什么。我得玩这个 void main() { spawn(&worker, thi
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
}
}
我尝试过使用共享变量,但DMD抱怨不允许使用可变线程本地数据的别名。或其他一些错误,视情况而定
这将如何在D中完成?或者,有没有一种方法可以利用信息进行这种交流 这并没有回答具体的问题,但ti确实澄清了我对消息传递api的误解 只需调用receiveTimeout,而不是普通的receive 我用这个:
shared class Queue(T) {
private T[] queue;
synchronized void opOpAssign(string op)(T object) if(op == "~") {
queue ~= object;
}
synchronized size_t length(){
return queue.length;
}
synchronized T pop(){
assert(queue.length, "Please check queue length, is 0");
auto first = queue[0];
queue = queue[1..$];
return first;
}
synchronized shared(T[]) consume(){
auto copy = queue;
queue = [];
return copy;
}
}
我已经得到了我需要的答案 简单地说,使用core.thread而不是std.concurrency。std.concurrency为您管理消息,不允许您自己管理消息。线程是std.concurrency在内部使用的 较长的答案是,我是如何完全实现它的 我创建了一个队列类型,它基于,但维护最后一个元素的指针。队列还使用标准组件inputRange和outputRange,或者至少我认为它是根据Walter Brights vision使用的。 队列还允许一个线程写入,另一个线程读取,而内部很少进行互斥,因此它应该是快速的。 我在这里共享的队列 具有第二个线程读取输入的简单实现:
Queue!string inputQueue = new Queue!string;
ThreadInput threadInput = new ThreadInput(inputQueue);
threadInput.start;
while (true) {
foreach (string value; inputQueue) {
writeln(value);
}
}
ThreadInput的定义如下:
class ThreadInput : Thread {
private Queue!string queue;
this(Queue!string queue) {
super(&run);
this.queue = queue;
}
private void run() {
while (true) {
queue.put(readln);
}
}
}
代码
再次排队不,这不是我真正需要的,但我确实错过了receiveTimeout,我不知道该怎么做。如果我不能得到任何其他工作,我可能可以使用receiveTimeout来做我需要做的事情。给receiveTimeout一个负值,比如-1,可以做你想做的事情。见: