Может ли Boost :: thread :: mutex разблокировать мьютекс, если у него нет владельца? - PullRequest
3 голосов
/ 15 марта 2019

Согласно документам 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 документа.

Примечание. Я изменил исходный код, чтобы более подробно описать поведение блокировки.)

...