Threads not garbage collected ?
Alex via Digitalmars-d
digitalmars-d at puremagic.com
Wed Feb 22 03:15:29 PST 2017
On Wednesday, 22 February 2017 at 05:39:50 UTC, rikki cattermole
wrote:
> On 22/02/2017 6:28 PM, Alex wrote:
>> import core.thread;
>>
>> class A
>> {
>> Thread mThread;
>> bool mStopped;
>>
>> this()
>> {
>> mThread = new Thread(&run);
>> mThread.start();
>> }
>>
>> void run()
>> {
>> while (!mStopped)
>> {
>> //do stuff
>> }
>> }
>> ~this()
>> {
>> mStopped = true;
>> mThread.join();
>> }
>> }
>>
>>
>>
>> void main()
>> {
>> auto a = new A;
>> delete a; //need this or the program hangs
>> }
>>
>> In both gdc and dmd I need to use manually delete this object
>> or the
>> program is blocked after main. Is by design ?
>> It seems undesirable, as the thread can be many layers of
>> encapsulation
>> down, and they all need manual deletes.
>
> Well, you never told the program to stop without delete.
>
> The thread that you start with (calls the main function)
> doesn't actually have to stay alive throughout the program
> running, surprise!
>
> Anyway, if you do want something that will stop try:
>
> import core.thread;
> import core.time;
> import std.stdio;
>
> class Foo : Thread {
> bool keepRunning;
>
> this() {
> keepRunning = true;
> super(&run);
> }
>
> private void run() {
> while(keepRunning) {
> sleep(1.seconds);
> writeln("iterate");
> }
> }
> }
>
> void main() {
> Foo foo = new Foo;
> foo.start;
>
> Thread.sleep(3.seconds);
> foo.keepRunning = false;
> }
That is interesting, I did not know that the main thread could
exit without returning control to the calling process.
Maybe this should be the case if we were writing in raw C against
OS threading calls, but in this case I clearly have a thread
Object not just an OS Handle, and I think most people would have
an expectation that the garbage collector looks after deleting
things in a garbage collected language when all the references
are gone.
I have also tested throwing an exception in main, and yes the
program hangs. This is even more of a problem because this
undesirable behaviour may only be observed under exceptional
circumstances.
More information about the Digitalmars-d
mailing list