d语言并发与递归

时间:2012-05-18 23:13:25

标签: recursion concurrency d phobos

我一直在尝试使用d语言的actor模型实现一个阶乘函数。 我的目标是使用创建actor来单独计算每个部分,然后生成一个新的actor来制作下一个。 我只是D的初学者,所以我只是学习如何使用这门语言。我的目标是将阶乘实现扩展到更多。这只是一个考验。

这是我的问题: 我正在尝试使用递归来实现阶乘;事实函数将为行中的下一个数字创建一个新的事实线程,除非它已达到基本条件。

我的代码:

void fact(Tid tid)
{

        int fact = 1;
        receive
        (
        (int i)
        {
            if(i == 0)
            {
                writeln("End of recursion");
            }
            else
            {
                fact *= i;
                send(thisTid, i-1);
            }
        }
    );
    send(tid, fact);
}

void main()
{

        auto tid = spawn(&fact, thisTid);
        int x = 3;
        send(tid, x);
        auto fact = receiveOnly!(int);
        writeln(fact);
}

我甚至不知道这是否可能,无论如何它都不起作用。如果我尝试在事实函数中添加spwn,则会返回以下错误:

src/main.d(62): Error: template std.concurrency.spawn does not match any function template declaration
/usr/include/x86_64-linux-gnu/dmd/phobos/std/concurrency.d(399): Error: template std.concurrency.spawn(T...) cannot deduce template function from argument types !()(int*,Tid)
src/main.d(63): Error: template std.concurrency.send does not match any function template declaration
/usr/include/x86_64-linux-gnu/dmd/phobos/std/concurrency.d(463): Error: template std.concurrency.send(T...) cannot deduce template function from argument types !()(_error_,int)

那么,有可能做我想做的事吗?怎么样? 如果没有,有没有计划做出这样的事情呢?

请帮助。

2 个答案:

答案 0 :(得分:4)

我可能会离开这里,但是从那个错误消息中我看起来dmd没有使用您认为它正在使用的fact,而是在spawn的调用中。你有几个名为fact的整数,虽然在这里(显然是减少了,因为它不是400行)例子中没有一个会发生冲突,在完整代码中我的猜测就是其中之一(因为{{1}如果&factint*),则为fact

尝试将函数重命名为factorial或某些此类函数,并在适当的位置更改int调用。确保不要更改整数。

答案 1 :(得分:2)

对我来说很好。您使用的DMD版本是什么?如果您尚未升级到2.059,也许可以尝试升级到2.059。

(注意:我说工作因为它编译并运行。它没有给出写回答,因为fact只返回receive一个数字,所以它只返回三个。你需要在循环中使用receive

admin@poita ~% cat test.d
import std.stdio;
import std.concurrency;

void fact(Tid tid)
{
    int fact = 1;
    receive
    (
        (int i)
        {
            if(i == 0)
            {
                writeln("End of recursion");
            }
            else
            {
                fact *= i;
                send(thisTid, i-1);
            }
        }
    );
    send(tid, fact);
}

void main()
{
    auto tid = spawn(&fact, thisTid);
    int x = 3;
    send(tid, x);
    auto fact = receiveOnly!(int);
    writeln(fact);
}

admin@poita ~% dmd test.d
admin@poita ~% ./test
3
admin@poita ~%