gpt4 book ai didi

d - 'setMaxMailboxSize' 的奇怪行为

转载 作者:行者123 更新时间:2023-12-04 03:01:51 25 4
gpt4 key购买 nike

我编写了一个简单但高度多线程的素数生成器。
算法是这样的:
线程 0:生成连续数。
线程 1 .. N:过滤掉不是素数的数字。
在每次发现"new"素数时,都会添加一个新的过滤器线程。

拿我来说:根本没有流量控制。
Thread 0 'send's numbers 绝对自由。
程序以信号 11(seg. fault)结束,很少发出信号 8,甚至很少成功完成。

取二:流量控制,'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 中的一个错误。尝试将 DMD 升级到 2.055。我不确定这个特定的错误是否已修复,但在 2.053 和 2.055 之间有很多错误修复。如果它仍然损坏,请在 http://d.puremagic.com/issues/ 提交错误报告.

关于d - 'setMaxMailboxSize' 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7702849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com