根据Boost.Thread的文档,unlock()似乎是由互斥量拥有的线程调用的。
要求:
当前线程拥有m。
但是,在我的测试中,其他线程可以解锁互斥锁。
include <iostream>
#include <boost/thread/thread.hpp>
boost::mutex m;
boost::mutex print_m;
void sleep(int seconds)
{
boost::this_thread::sleep_for(boost::chrono::seconds(seconds));
}
void print(const char* msg)
{
boost::mutex::scoped_lock lock(print_m);
std::cout << msg << boost::this_thread::get_id() << std::endl;
}
void lock()
{
print("Before Lock : ");
m.lock();
print("After Lock : ");
}
void unlock()
{
print("Before Unlock: ");
m.unlock();
print("After Unlock : ");
}
int main(int argc, char* argv[])
{
print("Main thread : ");
sleep(1);
boost::thread t1(lock);
sleep(1);
boost::thread t2(lock);
sleep(1);
boost::thread t3(unlock);
sleep(1);
boost::thread t4(unlock);
t1.join();
t2.join();
t3.join();
t4.join();
return 0;
}
结果是:
Main thread : 7f306a294740
Before Lock : 7f3068c6c700
After Lock : 7f3068c6c700
Before Lock : 7f306846b700
Before Unlock: 7f3067c6a700
After Unlock : 7f3067c6a700
After Lock : 7f306846b700
Before Unlock: 7f3067469700
After Unlock : 7f3067469700
(空行表示经过1秒。)
我对增强互斥锁解锁理解不正确吗?
P.S。
我知道互斥锁通常用于关键部分。
但是,我希望知道文档Requires
的确切含义。
注意:我更改了源代码以更详细地表达锁定行为。