Re[5]: внутренняя реализация std::mutex?
От: AlexGin Беларусь  
Дата: 17.05.18 16:09
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Здравствуйте, AlexGin, Вы писали:


AG>>Всё зависит от задач.

AG>>Я обычно мьютексы не использую, так как это "тяжёлые" системные объекты.
AG>>Насчет критических секций — не вижу ничего предосудительного в их применении.
AG>>Часто я аккуратно пользуюсь ими. Здесь важно — НЕ вводить в облась, защищенную секцией много кода:
AG>>
AG>>::EnterCriticalSection(m_pCS);
AG>>// Самые элементарные действия с общими ресурсами
AG>>::LeaveCriticalSection(m_pCS);
AG>>


V>Ну и зря. Под Windows, внутри Microsoft CRT, std::mutex не имеет ничего общего с WinAPI Mutex. Там, грубо, простой test_and_set, без захода в ядро.

Тогда отлично.
Можно им пользоваться достаточно спокойно!

AG>>Заполнять ядра CPU работой — это палка о двух концах:

AG>>При работе таких приложений, компьютер очень медленно реагирует на действия пользователя.
AG>>Правильнее — где-то в циклах рабочих потоков вводить ::Sleep(100...500);
AG>> — чтобы отдать управление системе (исключить жуткие тормоза для end-user-а).

V>Вот ни разу не встречал такого (только если не долбиться с тяжелым запросом в ядро в цикле).

Хорошо, — вот допустим, что у меня такой вариант "ожидания":
#include <atomic>
 
class SpinLock
{
public:
    void lock()
    {
        while(lck.test_and_set(std::memory_order_acquire)) // здесь, возможно, придется подождать!
        {}
    }
 
    void unlock()
    {
        lck.clear(std::memory_order_release);
    }
 
private:
    std::atomic_flag lck = ATOMIC_FLAG_INIT;
};

Взято отсюда:
http://anki3d.org/spinlock

Теперь предположим, что в результате некоторой ситуации все ядра моего CPU ждут на while в методе lock.
Да, случай практически не вероятный, но всё-таки — полностью НЕ исключаемый.
Загрузка всех секций CPU будет под 100% (здесь я даже не спрашиваю насчет полезноти/бесполезности данной вычислительной работы).
Спрошу только одно — сможет ли пользователь хоть как-то взаимодействовать с ОС? Хоть бы для того, чтобы снять эту зависшую задачу?

V>Всегда свои программы профилировали чтобы загрузка СPU была 100%. Если меньше, значит где-то холостые ожидания — значит код не оптимален, с точки зрения многопоточности.

+100500
Да, с точки зрения многопоточности НЕ оптимален.
Но если я вынужден буду только "топить Reset", чтобы хоть как-то вмешаться в работу системы, то такой код также не является корректным
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.