void wait(int seconds)
{
boost::this_thread::sleep(boost::posix_time::seconds(seconds));
}
boost::timed_mutex mutex;
void thread()
{
for (int i = 0; i < 5; ++i)
{
wait(1);
boost::unique_lock<boost::timed_mutex> lock(mutex, boost::try_to_lock);
if (!lock.owns_lock())
lock.timed_lock(boost::get_system_time() + boost::posix_time::seconds(1));//<<<<
std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl;
boost::timed_mutex *m = lock.release();
m->unlock();
}
}
質問>次の行を理解するのに問題があります。
if (!lock.owns_lock())
lock.timed_lock(boost::get_system_time() +
boost::posix_time::seconds(1));//<<<<
これが私の理解です。falseを返すと仮定lock.owns_lock()
します。これは、現在のオブジェクトがロック可能なオブジェクトのロックを所有していないことを意味します。したがって、次の行が実行されます。指定された時間が経過してもオブジェクトがロックを取得できない場合、boost::timed_lock
はfalseを返します。したがって、次の行が実行されます???
std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl;
この考えは正しいですか?コードの目的は、オブジェクトにロックがある場合に上記の行が実行されることを確認することだと思います。しかし、私の理解に基づいて(私は正しくないと思います)、上記の行は常に実行されます!
問題はどこだ?