非阻止并发邮件接收

时间:2015-07-24 17:23:00

标签: multithreading concurrency d nonblocking

是否有标准函数来接收并发消息但非阻塞?似乎std.concurrency中可用的所有函数都是阻塞的,而我发现的最接近非阻塞的函数是receiveTimeout,但它仍然等待超时。如果没有消息传递给线程,我希望它立即返回。

以下是我使用receiveTimeout提出的建议。

module main;

import std.concurrency;
import std.stdio : writefln, readln;
import core.time;
import core.thread;

void spawnedFunc() {
    while (true) {
        receiveTimeout(
            dur!("nsecs")(1),
            (int i) { writefln("Received %s", i); }
        );
        Thread.sleep(dur!("msecs")(100));
    }
}

void main() {
    auto tid = spawn(&spawnedFunc);
    while (true) {
        readln();
        send(tid, 42);
    }
}

更新

我最喜欢这样的功能吗?

void receiveNonBlocking(T...)(T ops) {
    receiveTimeout(
        dur!("nsecs")(1),
        ops
    );
}

...

receiveNonBlocking(
    (int i) { writefln("Received %s", i); }
);

1 个答案:

答案 0 :(得分:1)

查看receiveTimeout

的实施情况
if( period.isNegative || !m_putMsg.wait( period ) )
    return false;

因此,提供负超时,例如nsecs(-1),是这里的最佳选择。并且它不会真正影响性能,因为非阻塞功能的实现与当前具有超时功能的功能不会有很大不同。在退出具有否定超时的函数之前,再执行一次if检查。