d – ‘setMaxMailboxSize’的奇怪行为

我写了一个简单的,虽然高度多线程的素数生成器.

算法如下:

线程0:生成连续的数字.

线程1 .. N:过滤掉不是素数的数字.

在每次“新”主要发现时,添加新的过滤器线程.

拿I:根本没有流量控制.
线程0’绝对自由地发送数字.
程序以信号11(seg.故障)结束,很少信号8,甚至更少成功完成.

拿II:’setMaxMailboxSize’的流量控制为1.
大多数时候,一切都运作良好.

拿三:
现在,如果这一切都是由于某些内部未支持的溢出,那么它应该与’setMaxMailboxSize’一起做到2(甚至10),我错了吗?
线程0在第一次阻塞后卡住.

有人可以指导我,我错过了什么?

注1:
我在Ubuntu 10.04下使用DMD v2.053

笔记2:
这是我的代码:

#!/usr/bin/dmd -run

import std.stdio;
import std.conv;
import std.concurrency;

void main(string[] args)
{
    /* parse command line arguments */
    if (args.length < 2) {
        writeln("Usage: prime <number of primes to generate>");
        return;
    }
    auto nPrimes = to!int(args[1]);

    auto tid = spawn(&generate, thisTid);

    /* gather produced primes */
    for (;;) {
        auto prime = receiveOnly!int();
        writeln(prime);
        if (--nPrimes <= 0) {
            break;
        }
    }

    tid.send("stop");
}

void generate(Tid parentTid)
{
    bool terminate = false;

    // filter stage 1
    auto tid = spawn(&filter_stage, parentTid);
    /* WHAT DO I MISS HERE ? */
    setMaxMailboxSize(tid, 1, OnCrowding.block);

    for (int i = 2; !terminate; i++) {
        receiveTimeout(0,
            (string cmd) {
                writeln(cmd);
                terminate = true;
            }
        );

        tid.send(i);
    }
}

void filter_stage(Tid parentTid)
{
    auto prime = receiveOnly!int();
    parentTid.send(prime);

    // filter stage 'N'
    auto tid = spawn(&filter_stage, parentTid);

    filter(prime, tid);
}

void filter(int prime, Tid tid)
{
    for (;;) {
        receive (
            (int number) {
                if (number % prime != 0) {
                    tid.send(number);
                }
            }
        );
    }
}

最佳答案 听起来像是std.concurrency中的一个bug.尝试将DMD升级到2.055.我不确定这个特定的错误是否已修复,但2.053和2.055之间有很多错误修复.如果它仍然破裂,请在
http://d.puremagic.com/issues/提交错误报告.

点赞