Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/14: Рейтинг темы: голосов - 14, средняя оценка - 4.79
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,145

Баг с std::shared_mutex ?

12.02.2021, 09:54. Показов 2841. Ответов 19

Студворк — интернет-сервис помощи студентам
наткнулся на нечто странное. Хочется узнать, это я что-то не понимаю, либо это глюк компилятора?

пусть имеется такой синтетический пример кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <shared_mutex>
 
int main()
{
    while(1)
    {
        std::shared_mutex m;
 
        std::unique_lock lock{m};//блокировка. Без неё баг не наблюдается
 
        //тут авторазблокировка
 
        //тут вызов деструктора мутекса
    }
 
    return 0;
}
1)
Баг заключается в следующем:
При использовании компилятора MinGW 7.3.0 32-bit for C++ (под виндой) при на каждой итерации "течёт" озу и "текут" дескрипторы винды (это видно в диспетчере задач).
Если не вызывать блокировку, утечки нет.

2)
Если же создать объект мутекса до цикла, то утечки нет даже и с блокировкой. (В данном варианте конструктор/деструктор мутекса не вызывается каждую итерацию)

3)
А вот в VS2019 всё чётко, ничего не течёт

4)
Тот же самый код с Qt-шным QReadWriteLock+QWriteLocker проблем не даёт

5)
почему пример обозван синтетическим - вообще, в такую ситуацию довольно трудно попасть. Но я сумел Выбраться не сложно, но интересует природа бага
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.02.2021, 09:54
Ответы с готовыми решениями:

Нужно понять, что такое shared_mutex
Привет всем! Я уже где-то 9 месяцев учу C++, и мне пришла мысль попробовать начать удалённо работать. Так вот, резюме рассмотрели и...

std::regex : баг на сайте или баг компилятора?
http://en.cppreference.com/w/cpp/regex/regex_match этот код выкидывает throw... Добавлено через 35 секунд компилятор gcc 4.8

shared_mutex
Привет! Подскажите пожалуйста, на сколько я понял, boost::shared_mutex имеет политику: &quot;пока хотя бы один врайтер ждет, другие ридеры...

19
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.02.2021, 16:27
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Баг заключается в следующем:
При использовании компилятора MinGW 7.3.0 32-bit for C++ (под виндой) при на каждой итерации "течёт" озу и "текут" дескрипторы винды (это видно в диспетчере задач).
Если не вызывать блокировку, утечки нет.
Проверь на более поздних версиях, может поправили. Там же линуксоиды занимаются, возможно где-то случайно промазали. Или просто посмотри реализацию shared_mutex в своей версии mingw
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,145
12.02.2021, 17:06  [ТС]
заглянул я в исходники. Само собой, в этой каше утонул ))
Вот файл на всякий случай
shared_mutex.zip

обновлять компилятор пока боязно. Остальное работает - и ладно Когда буду QtCreator обновлять - выберу и его поновее.

Думал, кто сталкивался на этой версии и знает, в чём беда
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
12.02.2021, 17:06
Цитата Сообщение от Алексей1153 Посмотреть сообщение
shared_mutex

Не по теме:

Всегда, блин, забываю, нафига он нужен. И каждый раз вспоминаю, что это, как обычно в стандартной либе все через ж**у названо. И вместо говорящего rwlock - shared mutex.

0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,145
12.02.2021, 17:11  [ТС]
Vourhey, да по названиям вроде логично - shared mutex / shared lock / unique lock
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.02.2021, 17:13
Лучший ответ Сообщение было отмечено Алексей1153 как решение

Решение

Цитата Сообщение от Алексей1153 Посмотреть сообщение
обновлять компилятор пока боязно. Остальное работает - и ладно Когда буду QtCreator обновлять - выберу и его поновее.
Думал, кто сталкивался на этой версии и знает, в чём беда
Обнови компилятор. Похоже, исправили. Я вот это смотрел https://github.com/meganz/mingw-std-threads
1
12.02.2021, 17:16

Не по теме:

Цитата Сообщение от Алексей1153 Посмотреть сообщение
да по названиям вроде логично
По названию не понятна цель этого мьютекса. Каждый раз приходится вспоминать, почему он там shared и между кем.

0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,145
12.02.2021, 17:26  [ТС]
oleg-m1973, ещё вот нашёл нечто похожее https://sourceforge.net/p/mingw-w64/bugs/851/

при случае обновлю, короче

Vourhey, общий доступ - в том смысле, что писатель может работать только один под локом, но читателей одновременно хоть сколько могут зайти, если писателя нет в данный момент. Ну, назвали, как назвали, не самый худший вариант )
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
12.02.2021, 17:28
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Vourhey, общий доступ - в том смысле, что писатель может работать только один под локом, но читателей одновременно хоть сколько могут зайти, если писателя нет в данный момент.
Я знаю, для чего он нужен. Во всех языка и библиотеках, где хоть сколько-нибудь люди думают головой, это readwritelock, который сразу говорит о том, что он есть такое. А shared_mutex говорит о том, что он почти shared_ptr, только mutex.
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,145
12.02.2021, 17:30  [ТС]
а вообще, интерсные очучения - как дубиной по голове, откуда совсем не ждал. Меня неделю пилили этим багом, 32-битное приложение валилось раз в несколько дней. Сначала выяснил, что по нехватке памяти. Откуда бы ей там произойти - было непонятно. Потом сутки сидел нагружал, последовательно отключая всё любое, пока наконец не нашёл нужную строчку. После чего пару часов втыкал, что же там такое волшебное в этой строчке Результат - рафинированный пример с багом в первом посте и недосып
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.02.2021, 17:31
Цитата Сообщение от Vourhey Посмотреть сообщение
Во всех языка и библиотеках, где хоть сколько-нибудь люди думают головой, это readwritelock, который сразу говорит о том, что он есть такое. А shared_mutex говорит о том, что он почти shared_ptr, только mutex.
Да ладно, это не суть важно. И не забывай, что для стандартной библиотеки стараются выбирать имена, которые по-возможности нигде раньше не использовались.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
12.02.2021, 17:32
Алексей1153, круто

Добавлено через 57 секунд
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Да ладно, этон е суть важно.
Это очень важно.
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
И не забывай, что для стандартной библиотеки стараются выбирать имена, которые по-возможности нигде раньше не использовались.
Могли бы посмотреть, например, в pthread и сделать по аналогии. Там название понятное. Но комитет, как обычно, все через одно место.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.02.2021, 17:35
Цитата Сообщение от Vourhey Посмотреть сообщение
Могли бы посмотреть, например, в pthread и сделать по аналогии. Там название понятное.
Ок, перефразирую - стараются не давать имена по-аналогии, иначе много кода может отвалиться так, что потом концов не найдёшь.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
12.02.2021, 17:36
Алексей1153, вообще для таких ситуаций есть тулы различные для детекта ликов ресурсов. Не факт, что поможет, но чем чёрт не шутит.

Добавлено через 44 секунды
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
стараются не давать имена по-аналогии, иначе много кода может отвалиться так, что потом концов не найдёшь.
Например?
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,145
12.02.2021, 17:42  [ТС]
Vourhey, valgring сказал, что хочет линукс В студии вроде есть утилита, я даже пытался туда проект пересунуть ради таких высоких целей, но не осилил.

а вообще, я с утечками уже лет 10 не сталкиваюсь, голым new не пользуюсь, перекрёстными шаред поинтерами не балуюсь тоже. Потому и удивлялся, как же так - неужели ещё откуда-то может течь. А оно из самого неожиданного места вылезло

Добавлено через 1 минуту

Не по теме:

хотя нет, вот это чудо припоминаю QNetworkReply *QNetworkAccessManager::post(const QNetworkRequest &request, const QByteArray &data) - тоже нужно не забывать подчищать возврат после обработки

0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.02.2021, 17:45
Цитата Сообщение от Алексей1153 Посмотреть сообщение
. Меня неделю пилили этим багом, 32-битное приложение валилось раз в несколько дней. Сначала выяснил, что по нехватке памяти. Откуда бы ей там произойти - было непонятно.
А что за код-то был, что такое вылезло? То, что показано в первом посте, как ты сам там же заметил, не слишком адекватное.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
12.02.2021, 17:46
Цитата Сообщение от Алексей1153 Посмотреть сообщение
valgring сказал, что хочет линукс
Да. Valgrind еще на некоторые векторные инструкции слаб. Intel Inspector попробуй.
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,145
12.02.2021, 17:57  [ТС]
oleg-m1973, да ну, стыдно вспоминать Если кратко -структура со всеми полями std::atomic<...> (они работали нормально), но некоторые поля были не integral, поэтому для них была накостылена оболочка с мутексом навроде атомика. Происходили копирования объектов структуры. Само копирование было прописано корректно, но мутекс хулиганил утечками

Добавлено через 2 минуты
проблема вылезла на, казалось бы, безобидной строчке вроде myset.find(key), где myset - std::set с такими структурами
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
14.02.2021, 18:15
Vourhey, название переехало из boost::shared_mutex, как и многое другое.

https://ncona.com/2019/03/read... red_mutex/
A read-write mutex (also known: readers-writer, shared-exclusive, multiple-readers/single-writer, mrsw) is a specialization of a mutex that allows for greater performance in a scenario where reads are more frequent than writes.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
15.02.2021, 23:49
Цитата Сообщение от Croessmah Посмотреть сообщение
Vourhey, название переехало из boost::shared_mutex, как и многое другое.
Да, я знаю, что оно (и многое другое) переехало из библиотеки с названием "как делать не надо" aka Boost
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.02.2021, 23:49
Помогаю со студенческими работами здесь

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++ 2005 Express Edition. Образ диска...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

STL std::set, std::pair, std::make_pair
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы. Собственно перейдем к нашим баранам: есть...

Подходит ли shared_mutex в данном случае для одновременного доступа нескольких потоков к одному ресурсу?
три потока работают с одной очередью. поток READ считывает данные из файла и по одной строке и записывает в очередь. Поток WRITE записывает...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru