How to spawn a thread within method

eugene via Digitalmars-d digitalmars-d at puremagic.com
Thu Aug 11 06:39:34 PDT 2016


On Thursday, 11 August 2016 at 13:21:51 UTC, John Colvin wrote:
> On Thursday, 11 August 2016 at 12:09:37 UTC, eugene wrote:
>> Hello, everyone,
>> i'm testing my luck with this code, but it does not work. How 
>> to make it work?
>>
>> module test;
>>
>> import std.stdio, std.concurrency, std.variant;
>>
>> class Test {
>>     public:
>> 	void run()
>> 	{
>>             auto tid = spawn(&this.foo); // is it possible to 
>> do so?
>>
>> 	    foreach (i; 0 .. 10)
>> 	        tid.send(i);
>> 	    tid.send(1.0f);
>> 	    tid.send("hello");
>> 	    tid.send(thisTid);
>> 	
>> 	    receive((int x) => writeln("Main thread received message: 
>> ", x));
>> 	}
>>
>>     private:
>> 	void foo()
>> 	{
>> 	    bool cont = true;
>> 		
>> 	    while (cont)
>> 	    {
>> 	        receive(
>> 	            (int msg) => writeln("int received: ", msg),
>> 	            (Tid sender) { cont = false; sender.send(-1); },
>> 	            (Variant v) => writeln("huh?")
>> 	        );
>> 	    }
>> 	}
>> }
>>
>> void main()
>> {
>>     Test t = new Test();
>>     t.run();
>> }
>
> I think what's happening is that you're implicitly sharing the 
> "this" pointer of the class, which isn't allowed. Change foo to 
> static and it compiles.
>
> For some reason it segfaults on dpaste: 
> https://dpaste.dzfl.pl/feaa2b883e5b   but it runs fine on my 
> machine.

thank you


More information about the Digitalmars-d mailing list