Согласно документам Boost.Thread , unlock (), кажется, вызывается потоком, которому принадлежит мьютекс.
Требуется:
Текущийнить владеет м.
Но в моем тесте другой поток может разблокировать мьютекс.
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 секундупройдено.)
Неужели я не так понимаю о форсированной разблокировке мьютекса?
PS
Я знаю, что мьютекс используется для критической секции в целом.
Но я надеюсь, чтоточно знать, что означает Requires
документа.
Примечание. Я изменил исходный код, чтобы более подробно описать поведение блокировки.)