Starting and managing threads
Tejas
notrealemail at gmail.com
Tue Dec 28 15:42:04 UTC 2021
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
}
}
}
```
More information about the Digitalmars-d-learn
mailing list