Benyamin Jane
Benyamin Jane

Reputation: 407

How it is possible to wait inside thread loop

i want to know how it is possible to wait for a work to done and then continue and create new one

while(!stop)
{
    CreateWork();
    waitForWorkToDone();
}

wait must not block calling thread how i can achive this?

Upvotes: 0

Views: 623

Answers (2)

waTeim
waTeim

Reputation: 9225

To achieve this, you can rely on the operating system providing a facility to block until notified with or without a timeout. Thus, your thread correctly does not use unnecessary CPU cycles by performing a busy wait, but is still able to respond to program state changes. With POSIX threads, you can use a condition timed wait. I'll illustrate with the boost implementation, but the concept extends generally.

do
{
  boost::unique_lock<boost::mutex> lock(state_change_mutex);
  boost::system_time const timeout = boost::get_system_time() + boost::posix_time::seconds(5);

  state_change_cond.timed_wait(lock,timeout);

  ...

} while(!done);

Overall this thread will loop until the done sentinel value becomes true. Other threads can signal this thread by calling

state_change_cond.notify_all();

Or in this example if no signal happens in 5 seconds then the thread wakes up by itself.

Note that condition variables require locking by mutexes. This is to guarantee that the thread is awoken atomically and that it will behave correctly in a mutually exclusive section as inter-thread signaling implicitly is.

Upvotes: 2

Ansh David
Ansh David

Reputation: 672

How about Creating a Signal. Create a handler that creates CreateWork() and signals when the job is done! Just a Suggestion

Upvotes: 0

Related Questions