Thread overview
Thread issue
Jan 07, 2008
Raynor
Jan 07, 2008
Sean Kelly
Jan 09, 2008
Raynor
Jan 09, 2008
Sean Kelly
Jan 09, 2008
Raynor
January 07, 2008
Hi, I try to make a client/server application but i have issues with threads.

import std.thread;
import std.socket;
import std.stdio;

class Class1
{
    Thread listeningThread;
    Socket listeningSocket;

    this()
    {
        listeningThread = new Thread(&Listen);
        listeningThread.start();
    }

    int Listen()
    {
        listeningSocket = new Socket(AddressFamily.INET, SocketType.STREAM, ProtocolType.TCP);
        writefln("socket created\n");
        return (0);
    }
}

void main()
{
    auto class1 = new Class1();
}

The results is a "Error: Unable to create socket"
I know its normal because my program quit imediatly but when the thread is destroyed it wouldn't make an error.

I know objects are destroyed by the GC in any order so i tried the manual method :

import std.thread;
import std.socket;
import std.stdio;

class Class1
{
    Thread listeningThread;
    Socket listeningSocket;

    this()
    {
        listeningThread = new Thread(&Listen);
        listeningThread.start();
    }

    ~this()
    {
        delete listeningThread;
    }

    int Listen()
    {
        listeningSocket = new Socket(AddressFamily.INET, SocketType.STREAM, ProtocolType.TCP);
        writefln("socket created\n");
        return (0);
    }
}

void main()
{
    auto class1 = new Class1();
}

But it does the same error.

Can you help me please?
January 07, 2008
Raynor wrote:
> Hi, I try to make a client/server application but i have issues with threads.
> 
> import std.thread;
> import std.socket;
> import std.stdio;
> 
> class Class1
> {
>     Thread listeningThread;
>     Socket listeningSocket;
> 
>     this()
>     {
>         listeningThread = new Thread(&Listen);
>         listeningThread.start();
          listeningThread.wait();


Try adding this.  Phobos applications doesn't bother to wait for executing threads before terminating.


Sean
January 09, 2008
Sean Kelly a écrit :
> Raynor wrote:
>> Hi, I try to make a client/server application but i have issues with threads.
>>
>> import std.thread;
>> import std.socket;
>> import std.stdio;
>>
>> class Class1
>> {
>>     Thread listeningThread;
>>     Socket listeningSocket;
>>
>>     this()
>>     {
>>         listeningThread = new Thread(&Listen);
>>         listeningThread.start();
>           listeningThread.wait();
> 
> 
> Try adding this.  Phobos applications doesn't bother to wait for executing threads before terminating.
> 
> 
> Sean

If i add listeningThread.wait();, my application is blocked.
January 09, 2008
Raynor wrote:
> Sean Kelly a écrit :
>> Raynor wrote:
>>> Hi, I try to make a client/server application but i have issues with threads.
>>>
>>> import std.thread;
>>> import std.socket;
>>> import std.stdio;
>>>
>>> class Class1
>>> {
>>>     Thread listeningThread;
>>>     Socket listeningSocket;
>>>
>>>     this()
>>>     {
>>>         listeningThread = new Thread(&Listen);
>>>         listeningThread.start();
>>           listeningThread.wait();
>>
>>
>> Try adding this.  Phobos applications doesn't bother to wait for executing threads before terminating.
> 
> If i add listeningThread.wait();, my application is blocked.

If you don't wait for the thread then your application will leave main and exit, possibly without the thread ever running.  This isn't the case in Tango however, as it has daemon and non-daemon threads, much like Java.


Sean
January 09, 2008
Sean Kelly a écrit :
> Raynor wrote:
>> Sean Kelly a écrit :
>>> Raynor wrote:
>>>> Hi, I try to make a client/server application but i have issues with threads.
>>>>
>>>> import std.thread;
>>>> import std.socket;
>>>> import std.stdio;
>>>>
>>>> class Class1
>>>> {
>>>>     Thread listeningThread;
>>>>     Socket listeningSocket;
>>>>
>>>>     this()
>>>>     {
>>>>         listeningThread = new Thread(&Listen);
>>>>         listeningThread.start();
>>>           listeningThread.wait();
>>>
>>>
>>> Try adding this.  Phobos applications doesn't bother to wait for executing threads before terminating.
>>
>> If i add listeningThread.wait();, my application is blocked.
> 
> If you don't wait for the thread then your application will leave main and exit, possibly without the thread ever running.  This isn't the case in Tango however, as it has daemon and non-daemon threads, much like Java.
> 
> 
> Sean

class Class1
{
    Thread listeningThread;
    Socket listeningSocket;

    this()
    {
        listeningThread = new Thread(&Listen);
        listeningThread.start();
        listeningThread.wait(100);
    }

    int Listen()
    {
        listeningSocket = new Socket(AddressFamily.INET, SocketType.STREAM, ProtocolType.TCP);
        writefln("socket created\n");
        return (0);
    }
}

void main()
{
    auto class1 = new Class1();
}

It works with listeningThread.wait(100). I dont understand why it makes an error if the application quit without the thread ever running. If the thread never run, normaly it woudn't throw a socket error.