int main(int, char**) { SHOW(); boost::function<void()> fn = boost::bind(&locky, 10); boost::thread th(boost::bind(&lockwhile<boost::recursive_mutex>, fn, boost::ref(mtx))); usleep(10000); boost::recursive_mutex::scoped_lock triedlock(mtx, boost::defer_lock); std::cout << "try lock = " << triedlock.try_lock() << "\n"; std::cout << "try lock = " << triedlock.try_lock() << "\n"; std::cout << "try lock = " << triedlock.try_lock() << "\n"; std::cout << "owns lock = " << triedlock.owns_lock() << "\n"; std::cout << "get lock in other thread\n"; boost::recursive_mutex::scoped_lock otherlock(mtx); std::cout << "GOT\ntrying again...\n"; std::cout << "try lock = " << triedlock.try_lock() << "\n"; std::cout << "owns lock = " << triedlock.owns_lock() << "\n"; std::cout << "wait and join\n"; th.join(); }
bool operator==(const MetadataListImpl& list) const { std::unique_lock<std::mutex> mylock(m_mutex, std::defer_lock); // Released when out of scope std::unique_lock<std::mutex> otherlock(list.m_mutex, std::defer_lock); // Released when out of scope std::lock(mylock, otherlock); // Lock both, prevent deadlock return compareVectorsOfPointers(m_data, list.m_data); }