Graham Reitz wrote:
Is there a method to release all threads waiting on a mutex?
Yes.
Or, more
generally, a portable way to release a bunch of threads at the same
time?
Try condition::notify_all (see attached code for a sample).
Regards,
Tobias
#include <string>
#include <iostream>
#include
#include
#include
class runner : boost::noncopyable
{
boost::condition & go;
boost::mutex & mutex;
boost::thread thread;
public:
explicit runner(boost::condition & go_signal, boost::mutex & m)
: go(go_signal), mutex(m)
, thread( boost::bind(& runner::run, this) )
{ }
~runner()
{
thread.join();
}
private:
void run()
{
std::cout << std::hex;
{
boost::mutex::scoped_lock lock(mutex);
std::cout << "Runner @ 0x" << (std::ptrdiff_t) this
<< " ready to run." << std::endl;
go.wait(lock);
}
for (int i = 0; i < 1000; ++i)
{
// locking here so the output doesn't get scrambled
// and so that non thread-safe iostream variants won't crash
boost::mutex::scoped_lock lock(mutex);
std::cout << "Runner @ 0x" << (std::ptrdiff_t) this
<< " running." << std::endl;
}
}
};
int main()
{
boost::condition go_signal;
boost::mutex m;
runner x(go_signal,m);
runner y(go_signal,m);
runner z(go_signal,m);
std::string s;
std::getline(std::cin, s);
go_signal.notify_all();
return 0;
}