Multithreading 使用队列在D中的线程之间进行通信

Multithreading 使用队列在D中的线程之间进行通信,multithreading,d,Multithreading,D,在D中,使用std.container.dlist创建队列类型非常简单 我希望有多个线程,但让它们与队列通信,而不是与消息传递通信。据我所知,这些消息被设计为总是在代码中的特定点接收数据;接收线程将阻塞,直到收到预期的数据 编辑:我被告知receiveTimeout,但在这种情况下,只有一个无超时和一个检查更合适,可能是0?的超时?。此外,如果在接收任何消息之前发送多条消息,我也不确定消息API会做什么。我得玩这个 void main() { spawn(&worker, thi

在D中,使用std.container.dlist创建队列类型非常简单

我希望有多个线程,但让它们与队列通信,而不是与消息传递通信。据我所知,这些消息被设计为总是在代码中的特定点接收数据;接收线程将阻塞,直到收到预期的数据

编辑:我被告知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
    }
}
我尝试过使用共享变量,但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,可以做你想做的事情。见: