Большая загрузка процессора с использованием std :: lock (c ++ 11)

Мои недавние усилия по реализации диспетчера потоков / мьютексов привели к 75% загрузке ЦП (4 ядра), в то время как все четыре запущенных потока были либо в спящем режиме, либо в ожидании разблокировки мьютекса.

Конкретный класс слишком велик для того, чтобы его можно было разместить здесь целиком, но я мог бы сузить причину до безопасного зацепления двух мьютексов

std::unique_lock lock1( mutex1, std::defer_lock );
std::unique_lock lock2( mutex2, std::defer_lock );
std::lock( lock1, lock2 );

Другая часть класса используетstd::condition_variable сwait() а такжеnotify_one() наmutex1 для некоторого кода, который будет выполняться выборочно в то же время.

Простое изменение на

std::unique_lock lock1( mutex1 );
std::unique_lock lock2( mutex2 );

довел загрузку процессора до нормального уровня 1-2%.

Я не могу поверить, чтоstd::lock() функция неэффективна. Может ли это быть ошибкой в g ++ 4.6.3?

редактировать: (пример)

#include 
#include 
#include 
#include 
#include 
#include 

std::mutex mutex1, mutex2;
std::condition_variable cond_var;

bool cond = false;
std::atomicdone{false};

using namespace std::chrono_literals;

void Take_Locks()
    {
    while( !done )
        {
        std::this_thread::sleep_for( 1s );

        std::unique_lock lock1( mutex1, std::defer_lock );
        std::unique_lock lock2( mutex2, std::defer_lock );
        std::lock( lock1, lock2 );

        std::this_thread::sleep_for( 1s );
        lock1.unlock();
        lock2.unlock();
        }
    }

void Conditional_Code()
    {
    std::unique_lock lock1( mutex1, std::defer_lock );
    std::unique_lock lock2( mutex2, std::defer_lock );

    std::lock( lock1, lock2 );
    std::cout < "t4: waiting \n";

    while( !cond )
        cond_var.wait( lock1 );

    std::cout < "t4: condition met \n";
    }

int main()
    {
    std::thread t1( Take_Locks ), t2( Take_Locks ), t3( Take_Locks );
    std::thread t4( Conditional_Code );

    std::cout < "threads started \n";
    std::this_thread::sleep_for( 10s );

    std::unique_lock

Ответы на вопрос(4)

Ваш ответ на вопрос