How Stop Worker Thread if Owner Thread is Finished?

Johann Lermer johann.lermer at elvin.eu
Tue Oct 27 08:33:36 UTC 2020


You could tell your thread via a shared variable that main has 
ended:

import std.stdio;
import std.concurrency;
import core.thread;

shared bool end = false;

void thread ()
{
	for (;;)
	{
		Thread.sleep (500.msecs);
		synchronized
		{
			if (end) break;
		}
	}
	writeln ("thread ends");
}

void main ()
{
	spawn (&thread);
	Thread.sleep (3.seconds);
	writeln ("main ends");
	synchronized
	{
		end = true;
	}
}

or you could use the fact, that receiveTimeout throws an 
exception, when main ends (although I don't know if this is the 
intended behaviour; the manual just says that it throws an 
exception when the sending thread was terminated):

import std.stdio;
import std.concurrency;
import core.thread;

void thread ()
{
	for (;;)
	{
		try
		{
			receiveTimeout (500.msecs);
		}
		catch (Throwable)
		{
			break;
		}

	}
	writeln ("thread ends");
}

void main ()
{
	auto tid = spawn (&thread);
	Thread.sleep (3.seconds);
	writeln ("main ends");
}




More information about the Digitalmars-d-learn mailing list