powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как в многопоточной программе ПЕРЕвыделять память?
25 сообщений из 101, страница 2 из 5
Как в многопоточной программе ПЕРЕвыделять память?
    #39553721
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLDima TОткуда инфа? Они потокобезопасны.

пропущено...


Тут http://en.cppreference.com/w/cpp/memory/c/malloc говорится, что они потокобезопасны только с С++17

С рождения они потокобезопасны.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553725
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbpatchКак минимум это ожидается. Qt вообще перекрывают собой все что можно, если что не так - читай их доку, пиши в саппорт.


Вообще- то Qt ничего не перекрывает, а предоставляет свои дополнительные библиотеки. Если нет желания ими пользоваться, то будет чистый С / С++.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553727
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivAlekseySQLНасколько я понял malloc и realloc не являются потокобезопасными.

0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую.
(чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно)
1) malloc, realloc являются потокобезопасными.

2) в C++ вообще нужно использовать std::vector

Большое спасибо!
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553730
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TAlekseySQLпропущено...


пропущено...


Ну да, thread-safe определяется реализациямифункций, которые вызываются из библиотек: если они написаны с учетом многопоточности, то все будет ок.
Как понимаю (since C++17) относится только к std::aligned_alloc, т.к. в более ранних стандартах ее нет.

Да этим функциям 100 лет в обед, они всегда были потокобезопасны, как только появились потоки и многопоточные версии CRT.
Другое дело, что ТОЛЬКО СЕЙЧАС (в C++11) этот факт зафиксирован в стандарте как требование (там требование НЕ ТОЛЬКО потоко безопасности, но и относительной упорядоченности вызовов к ним, на сколько я понял из краткого прочтения статьи).
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553732
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно?

Будут потокобезопасны.

А что насчет memcpy?

НЕ БУДЕТ потокобезопасна.
В том смысле, что с одной памятью в разных потоках оперировать ею нельзя.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553737
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую.
(чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно)


Это потому что в копируемой области можно использовать только POD- объекты? У меня как раз такой случай.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553739
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivТак и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно?

Будут потокобезопасны.

А что насчет memcpy?

НЕ БУДЕТ потокобезопасна.
В том смысле, что с одной памятью в разных потоках оперировать ею нельзя.

Спасибо! Разумеется memcpy в разных потоках будет копировать разную память (каждый поток делает что-то для себя). Я про то, что некоторые функции хранят свое состояние, и их вызов из разных потоков может привести к ошибке.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39554096
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLMasterZiv0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую.
(чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно)


Это потому что в копируемой области можно использовать только POD- объекты? У меня как раз такой случай.

Я написал почему.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559237
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую.
(чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно)
Ну полнейшая же чушь. Выделена у меня гора памяти, и надо довыделить еще пару байт. И что, мне не пытаться сделать мгновенный реаллок? Сразу снова выделять, копировать и освобождать?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559276
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockMasterZiv0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую.
(чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно)
Ну полнейшая же чушь. Выделена у меня гора памяти, и надо довыделить еще пару байт. И что, мне не пытаться сделать мгновенный реаллок? Сразу снова выделять, копировать и освобождать?
реаллок что по твоему должен делать? Вжух и память появилась? Про адресное пространство не забывай: например тебе выделили память с адреса 0 по 100500, а с адреса 100501 выделили еще кому-то, и тут ты просишь еще 10 байт ... , но тебе же надо не 10 байт а непрерывный кусок 100510 байт, поэтому копирование.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559277
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tнапример тебе выделили память с адреса 0 по 100500, а с адреса 100501 выделили еще кому-то
А если не выделили?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559279
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockDima Tнапример тебе выделили память с адреса 0 по 100500, а с адреса 100501 выделили еще кому-то
А если не выделили?
Может и так, но спросить "так или не так" не у кого. Работа менеджера памяти не документирована.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559296
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TМожет и так, но спросить "так или не так" не у кого. Работа менеджера памяти не документирована.
Именно есть у кого. Для этого и предназначен realloc.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559302
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никто не забыл, что память выделяется страницами, да еще и с виртуализацией страниц?

Пока в странице, вообще нет проблем расшириться.

А если нет - то дописать процессору в табличку аллокаций VM линейное расширение (я не настолько ос разработчик, но АФАИК, это тоже небольшая проблема)
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559303
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на уровне ЦПУ
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559317
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglНикто не забыл, что память выделяется страницами, да еще и с виртуализацией страниц?
Пока в странице, вообще нет проблем расшириться.Это у системы память запрашивается страницами.
Диспетчер памяти в приложении оперирует более мелкими блоками - байт этак по восемь.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559326
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovSiemarglНикто не забыл, что память выделяется страницами, да еще и с виртуализацией страниц?
Пока в странице, вообще нет проблем расшириться.Это у системы память запрашивается страницами.
Диспетчер памяти в приложении оперирует более мелкими блоками - байт этак по восемь.Даже если бы это было правдой, то шанс довыделить память реаллоком (для указателя - обычная задача) без перевыделения/копирования/освобождения, был бы равен 50%. Что в 2 раза производительнее.
Не знаю, как там по версиям сей, но:
1. В старых делфях менеджер резервирует константу, которую можно задать;
2. В Win10 вообще ИИ - вначале резервируется 128, потом килобайт, потом 10, потом не знаю - это я на глаз проверил. Это дает прирост производительности в сотни-тысячи раз при использовании GlobalRealloc.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559331
вЪю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockДаже если бы это было правдой,

Это лехко проверить. Например тут или тут .
В общем случае эффективность realloc сильно зависит выбранного от менеджера памяти.
ИМХО использование realloc - плохая практика.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559527
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockBasil A. SidorovДиспетчер памяти в приложении оперирует более мелкими блоками - байт этак по восемь.Даже если бы это было правдойВы правда думаете, что вектор из миллиона указателей на килобайтовый буфер получит по отдельной странице на каждый буфер?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559534
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovYuRockпропущено...
Даже если бы это было правдойВы правда думаете, что вектор из миллиона указателей на килобайтовый буфер получит по отдельной странице на каждый буфер?Мне это безразлично. Я не думаю, а знаю, что в менеджерах памяти, которыми я пользуюсь, realloc возвращает (мгновенно) не NULL в подавляющем большинстве случаев. И проверка "на всякий случай" с долгим перевыделением и копированием может вообще никогда не отработать за время жизни программы, а если и отрабатывает - то крайне редко. Зависит от размера довыделяемой памяти. Например, если по 512 байт довыделяю - то 1 раз из 10, по 10кб - 3 раза из 10, по 4 байта - 0 раз из 100.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559537
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockМне это безразлично.А зря. Интуиция - плохой советчик.

P.S. Копирование десятка мегабайт занимает единицы миллисекунд на не самых быстрых процах.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559545
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovА зря. Интуиция - плохой советчик.Какая интуиция? Я говорил о реальных фактах.
Basil A. SidorovКопирование десятка мегабайт занимает единицы миллисекунд на не самых быстрых процахКак-то скромно упущено количество миллисекунд, необходимое для выделения и освобождения указателя для десятков мегабайт.

P.S. Копирование пройдет быстро, если память уже реально выделена, а не только указатель на нее дан. А когда при копировании она только реально выделяться начнет, то дело будет станет далеко не только в скорости проца, а и физ. кол-ве памяти, и в винте, и в чем угодно еще, в той же загруженности проца, винта...
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559546
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovединицы миллисекунд на не самых быстрых процахА в цикле постоянно если это происходит - надо, значит, "самые быстрые процы" покупвть, чтобы программа работала без тормозов?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559547
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockP.S. Копирование пройдет быстро, если память уже реально выделенаДля realloc есть какой-то другой сценарий?А когда при копировании она только реально выделяться начнет, то дело будет станет далеко не только в скорости проца, а и физ. кол-ве памяти, и в винте, и в чем угодно еще, в той же загруженности проца, винта..."А ты не путай свою шерсть с государственной" (ц) кинокомедия "Кавказская пленница".
Есть запросы памяти у системы (делаются большими блоками) и есть работа *alloc в приложении. Вот последние оперируют блоками с гранулярностью в единицы байт.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559548
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockА в цикле постоянно если это происходит - надо, значит, "самые быстрые процы" покупвть, чтобы программа работала без тормозов?Можно просто нанять программиста более высокой квалификации. Который сумеет реализовать более адекватный алгоритм.
...
Рейтинг: 0 / 0
25 сообщений из 101, страница 2 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как в многопоточной программе ПЕРЕвыделять память?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]