Opened 13 years ago

Closed 12 years ago

#3960 closed Bugs (duplicate)

condition_variable::timed_wait() cannot be interrupted

Reported by: anonymous Owned by: Anthony Williams
Milestone: Boost 1.43.0 Component: thread
Version: Boost 1.42.0 Severity: Problem
Keywords: Cc:

Description

I have a boost::condition_variable::timed_wait() with predicate functor overload in a thread. It's working fine, if the condition is satisfied it wakes up, and goes on in the execution. However, I'd like to have an option to terminate the thread at this waiting-point so I made an boost::thread::interrupt call on this running thread and before I remove the object I used the join() method to wait until the thread is really quits. I did not catch any boost::thread_interruption exception in the thread after I call the interrupt() method. I added an exception handler, with a simple return and a break point on it, but it was never hit. After some struggling I tried to send a notification to the condition variable (notify_one() method) and surprisingly it caught the exception mentioned above. This is clearly different behaviour as it was described in the documentation under the Thread Management/Predefined Interruption Points section where it claims that the condition_variable::timed_wait() is supposed to be an interruption point which means it needs to wake up with calling only the interrupt() method. I also think that is a bug not a documentation issue since when I tried to replace the condition_variable::timed_wait() to a simple this_thread::sleep() call, the interrupt immediately made the thread wake up and catch the thread_interruption exception.

I'm not sure is this part involved in the same issue but I had to remove the coped_lock in the predicate function because it caused a deadlock there. It is really weird because the one and only other location where I'm using that mutex is in the wait_for_players() method and that supposed to run in the same thread. The mutex in the predicate function is maybe pointless but I saw this solution in many sample code (and makes sense if the predicate function has a block somewhere inside but in my case it is not necessary). How is it possible that the predicate function gets the mutex as it is locked?

Attachments (1)

sample.cc (365 bytes ) - added by gyula.gubacsi@… 13 years ago.
Partial code

Download all attachments as: .zip

Change History (5)

by gyula.gubacsi@…, 13 years ago

Attachment: sample.cc added

Partial code

comment:1 by gyula.gubacsi@…, 13 years ago

Sorry, that wasn't a timed_wait() but a wait().

comment:2 by viboes, 12 years ago

The difference is that as far as you have a timeout you will be wake up and the the interruption check point will be done. You can pool with a timed_wait with the granularity you want to achieve the behavior you want. Other than polling I don't see any other solution. And make the wait function pool on a default granularity will penalize the users that don't need to interrupt the thread.

It is also true that the documentation let think that wait will be interrupted if a interrupts is signaled, but it does this only before and after the underlying wait.

"The following functions are interruption points, which will throw boost::thread_interrupted if interruption (BEFORE CALLING) is enabled for the current thread, and interruption is requested for the current thread: "

Maybe the library could add a interruptible wait with a specific granularity.

comment:3 by viboes, 12 years ago

See also ticket:2330 which gives an implementation that doesn't seems too expensive.

comment:4 by Anthony Williams, 12 years ago

Resolution: duplicate
Status: newclosed

Duplicate of 2330

Note: See TracTickets for help on using tickets.