Boost logo

Boost Users :

From: William E. Kempf (wekempf_at_[hidden])
Date: 2003-01-24 00:01:25


Aschwin Gopalan said:
> William E. Kempf wrote:
>
>>> From: "hlh771 <hlh771_at_[hidden]>" <hlh771_at_[hidden]>
>>>
>>> How to stop(or cancel) a thread? Suppose I have a main thread and a
>>> worker thread, the worker thread does something looply,and when the
>>> main thread get a message indicating the process should exit, I want
>>> stop the worker thread,how to do that?I have read other thread
>>> library,their thread class supply a method called stop or cancel
>>> which stops the thread. Their Implementation is:the thread class has
>>> a data member indicating whether the thread should stop,and the
>>> thread function looply check the data member whether the thread
>>> should stop.Generally the data member's type is a bool or Event. Is
>>> it the best way to stop the thread? How the boost to deal with this?
>>> Thanks in advance.
>>
>> Today you should use a flag and a condition/mutex combination. Direct
>> support for cancellation is being provided in a future release.
>
> Actually, this works fine for ordinary loops. The problem I
> am facing is how to stop a thread which may sit in blocking
> system calls like reading from a (blocking) socket. Is there
> any "standard" way to solve this problem? Now, I am using
> nonblocking sockets, implementing "timeouts" myself, but it
> just doesn't feel right...

No, there's no "standard" way to do this, and it's one of the most
difficult things I'm facing with adding cancellation to Boost.Threads.
For specific cases there's usually a solution. For example, in your case
you could use select() with a file descripter created for the sole purpose
of waking up the thread when you want to cancel it. But solutions like
this are not necessarily completely portable, and don't apply to every use
case where there's a blocking call.

William E. Kempf
wekempf_at_[hidden]


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net