简体   繁体   中英

How do I know if a boost thread is done?

I am using boost::thread to process messages in a queue. When a first message comes I start a message processing thread. When a second message comes I check if the message processing thread is done.

if it is done I start a new one if it is not done I don nothing.

How do I know if the thread is done ? I tried with joinable() but it is not working, as when the thread is done, it is still joinable.

I also tried to interrupt the process at once, and add an interruption point at the end of my thread, but it did not work.

Thanks

EDIT :

I would like to have my thread sleep for an undetermined time, and wake up when a signal is triggered.

The mean to do it is boost::condition_variable

As far as I know you should use the join() method to wait the end of a thread execution. You can use it with a timeout with timed_join().

You can interrupt threads with interrupt(). In this case, inside the thread an exception will occur if the execution reaches an interruption point ( a boost::this_thread::sleep() or boost::this_thread::interruption_point() ). You catch the exception inside the thread and you can then close it.

Spawning a new thread for each incoming message is very inefficient. You should check out the Thread pool pattern .

EDIT:

Sorry, jules, I misread your question. I recommend you take a look at the producer-consumer pattern. Check out this article on how to roll your own blocking queue using boost condition variables. Intel's Thread Building Blocks also has a blocking queue implementation.

Check out this SO question about existing lock-free queue implementations.

Hope this helps.

Have you tried checking get_id() with boost::this_thread::get_id(). If they match the thread does not exist. But that will only happen if you have exited the thread.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM