семантика перемещения для std::unique_lock

Разбираюсь с семантикой перемещения std::unique_lock и в следующей тестовой программе получаю ошибку "abort() has been called".

#include <iostream>
#include <mutex>
#include <thread>

void thr5_func(std::unique_lock<std::mutex> &&lock, bool t)
{
 lock.unlock();
  uint8_t y=5, jj=9;
   y=jj+10;
}

void thr6_func(std::mutex& mut)
{
 std::unique_lock<std::mutex> locku(mut); //Здесь ошибка "abort() has been called"
 uint8_t t = 5, jk = 5;
 
 jk = jk + t;
 t++;
 jk-=1;
}


int main()
{

 std::mutex mut;
 std::unique_lock<std::mutex> locku(mut);

 std::thread thr5(&thr5_func, std::move(locku), true);
 std::thread thr6(&thr6_func, std::ref(mut));

 if (thr5.joinable())
  thr5.join();

 if (thr6.joinable())
  thr6.join();
 return 0;  
}

Сначала стартует thr5, а затем thr6 и при попытке захвата мьютекса вылетает ошибка. Прошу подсказать в чем причина ошибки. Заранее спасибо!


Ответы (1 шт):

Автор решения: user7860670

Вызов unlock когда мьютекс не захвачен текущим потоком является неопределенным поведением.

→ Ссылка