Boost logo

Boost :

From: Hu Xinwei (huxw_at_[hidden])
Date: 2002-11-25 11:45:29


>Hu Xinwei wrote:

>> - How to interupt a thread waiting on some socket event
>> (synchronous and asynchronous) from another thread?
>
> IMHO, I dont think such a mechanism is needed.

>A typical example: You have a thread that implements a synchronous
>listener like this:

>bind();
>listen();

>while (true)
>{
> fd = accept();
> // add fd to some connection list
>}

>It is surprisingly difficult to portably tell this thread that it
>should terminat itself.

 Well, the portable method I know is like this:
 listen thread:
 for (;;)
 {
   fd = accept();
   if(server_should_shutdown)
   {
      //do something here then exit
   }
   //process fd here
 }

 helper thread:
 set_server_should_shutdown();
 connect_server_itself();
 
 So no interrupt is needed here.
>>> - How do you wait for more than just socket events? Thread
>>> conditions, window messages, ...
>>
>> I think that is not a problem too. We at such a condition, should
>> have 2 threads, one to block on socket, and another handles all
>> other messages from os, other processes...... If you are really
>> intersted in the thread conditions, you have to poll them by
>> yourself, because there is no such a generic mechanism on every
>> platform

>And that's one of the main reasons why we should provide one. At least
>a possible interaction with conditions from boost threads.

>> and it is rearly used.

>What makes you think so? It's quite important in server programming.

 I prefer to make all sockets work in blocking mode, when I use threading-model.
 Reactor or Proactor are other problems. ;-)

>> IMO, thread model is used to simplify your design. One thread
>> should take one resposibility and one only.

>Say you have a thread responsible for communication with some clients.
>You have to have a way to tell this thread that there is new data
>available for the client. At the same time the thread has to wait for
>new data coming in from the client. How do you solve this?

 It depends.

 For example, a tcpforwarder. I'll create 2 threads, one for server to client, another for client to server.
 For another example, a file-sender. I'll block on send, no matter if there're new data from other threads.
 One more example, a file-reciever. I'll block recv then block on save.

 In fact, all works performed in one thread should be syncronized. So, I think, a well designed server can avoid this problem.

>Markus


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk