Starting and managing threads

Bagomot bagomot at gmail.com
Tue Dec 28 16:29:05 UTC 2021


On Tuesday, 28 December 2021 at 15:42:04 UTC, Tejas wrote:
> On Tuesday, 28 December 2021 at 14:19:46 UTC, Bagomot wrote:
>> On Monday, 27 December 2021 at 10:59:07 UTC, Ali Çehreli wrote:
>>> On 12/27/21 1:33 AM, Bagomot wrote:
>>>
>>> > separate thread, without blocking the main one.
>>>
>>> I think you can use std.concurrency there. I have a chapter 
>>> here:
>>>
>>>   http://ddili.org/ders/d.en/concurrency.html
>>>
>>> Look for 'struct Exit' to see how the main thread signals 
>>> workers to stop running.
>>>
>>> And some std.concurrency hints appear in my DConf Online 2020 
>>> presentation here:
>>>
>>>   https://dconf.org/2020/online/#ali1
>>>
>>> Ali
>>
>> I tried to run with std.concurrency via spawn, but this does 
>> not work for me for the reason that in the program I run the 
>> thread not from main, but from the object. It looks something 
>> like this:
>>
>> ```d
>> import std.concurrency;
>> import std.thread;
>>
>> void main() {
>> 	Test.getInstance.run;
>> }
>>
>> class Test {
>> 	private {
>> 		__gshared Test instance;
>> 		Watcher[] watchers;
>> 	}
>>
>> 	protected this() {
>> 	}
>>
>> 	public static Test getInstance() {
>> 		if (!instance) {
>> 			synchronized (Test.classinfo) {
>> 				if (!instance)
>> 					instance = new Test;
>> 			}
>> 		}
>>
>> 		return instance;
>> 	}
>>
>> 	public void run() {
>> 		foreach (Watcher watcher; this.watchers) {
>> 			spawn(&watcher.run);
>> 		}
>> 	}
>> }
>>
>> class Watcher {
>> 	public void run() {
>> 		while (true) {
>> 			// job
>> 		}
>> 	}
>> }
>> ```
>> Error: template `std.concurrency.spawn` cannot deduce function 
>> from argument types `!()(void delegate())`.
>>
>> I would not want to do this from main because it breaks the 
>> structure of my program. Is there a way to do it the way I 
>> want?
>
>
> Yes, you'll have to make the function that you want to run 
> static and all the arguments must be `shared` qualified, ie, 
> TLS not allowed
> ```d
>
> import std.concurrency;
> import core.thread;
> import std.stdio:writeln;
>
> void main() {
> 	Test.getInstance.run;
> }
>
> class Test {
> 	private {
> 		__gshared Test instance;
> 		shared Watcher[] watchers = [new Watcher(), new Watcher()]; 
> //notice the shared // I used 2 values just to show some output
> 	}
>
> 	protected this() {
> 	}
>
> 	public static Test getInstance() {
> 		if (!instance) {
> 			synchronized (Test.classinfo) {
> 				if (!instance)
> 					instance = new Test;
> 			}
> 		}
>
> 		return instance;
> 	}
>
> 	public void run() {
> 		foreach (ref/+use ref to ensure no copies are made. I don't 
> tknow the right thing to do here, the errors went away when I 
> used ref so...+/ watcher; this.watchers) {
> 			spawn(&Watcher.run, watcher);
> 		}
> 	}
> }
>
> class Watcher {
> 	static public void run(shared Watcher watcher/+sending as 
> argument since function can't have an invisible this parameter 
> anymore+/) {//now this is static
> 		while (true) {
> 			// job
>       writeln("It works now :D");
>       break; //wrote this so that you can copy-paste to 
> run.dlang.io
> 		}
> 	}
> }
> ```

I can't do it according to your example, my Watcher list fills up 
at runtime.


More information about the Digitalmars-d-learn mailing list