我写了一个简单的,虽然高度多线程的素数生成器.
算法如下:
线程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/提交错误报告.