Problems with receive
Stanislav Blinov
stanislav.blinov at gmail.com
Sun Aug 29 13:09:18 PDT 2010
Bob Cowdery wrote:
> On 29/08/2010 19:17, Stanislav Blinov wrote:
>> Bob Cowdery wrote:
>>> Hi
>>>
>>> I'm trying out some very simple concurrency tests to make sure I
>>> understand how it operates. However I'm having a few problems. I'm sure
>>> this is just lack of knowledge. I dont know enough to debug these things
>>> on my own yet.
>>>
>>> Bob
>>>
>>> The test below builds but does not output anything so I assume for some
>>> reason the pattern matching is not working. If I uncomment the line
>>> adding a variant pattern it gives me a compile error.
>>>
>>> Error: static assert "function with arguments (VariantN!(maxSize))
>>> occludes successive function"
>>> But there is no successive function, its the last statement.
>>>
>>> Also I tried using a function address instead of a literal but that
>>> gives me a compile error:
>>> Error: static assert (false || false) is false
>>>> From the code it looks its saying that myfunc is not a function.
>>> import std.concurrency, std.stdio, std.variant;
>>>
>>> int main(char[][] args)
>>> {
>>> auto low = 0, high = 100;
>>> auto tid = spawn(&tfun);
>>> foreach(i;low .. high) {
>>> tid.send(thisTid,i);
>>> }
>>> writeln("Exiting");
>>> return 0;
>>> }
>>>
>>> void myfunc(double x) {
>>> writeln("Got : ", x);
>>> }
>>>
>>> void tfun() {
>>> receive(
>>> //&myfunc,
>>> (int x) {writeln("Got : ", x);}//,
>>> //(Variant any) {writeln("Got : ", any);}
>>> );
>>> };
>> I'm not sure about Variant part yet (never tried it myself), but as
>> for (int x) { /*...*/ } you've got the wrong signature. What you send
>> is (Tid,int), but what you're trying to receive is (int). Try changing
>> your tfun to receive (Tid, int x).
>
> Thank you. I was following the book blindly without thinking, and the
> book says (int x) will match 'send(tid, 5)' etc.
Well, there's no misguiding here. It's just that there are two versions
of send(), at least in current implementation. One is a free function
that gets the destination Tid as its first parameter, the other is Tid's
method. So send(tid, 5) is (almost) equivalent to tid.send(5).
More information about the Digitalmars-d-learn
mailing list