Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLDima TОткуда инфа? Они потокобезопасны. пропущено... Тут http://en.cppreference.com/w/cpp/memory/c/malloc говорится, что они потокобезопасны только с С++17 С рождения они потокобезопасны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 16:53 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
dbpatchКак минимум это ожидается. Qt вообще перекрывают собой все что можно, если что не так - читай их доку, пиши в саппорт. Вообще- то Qt ничего не перекрывает, а предоставляет свои дополнительные библиотеки. Если нет желания ими пользоваться, то будет чистый С / С++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 16:55 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
MasterZivAlekseySQLНасколько я понял malloc и realloc не являются потокобезопасными. 0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую. (чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно) 1) malloc, realloc являются потокобезопасными. 2) в C++ вообще нужно использовать std::vector Большое спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 16:57 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TAlekseySQLпропущено... пропущено... Ну да, thread-safe определяется реализациямифункций, которые вызываются из библиотек: если они написаны с учетом многопоточности, то все будет ок. Как понимаю (since C++17) относится только к std::aligned_alloc, т.к. в более ранних стандартах ее нет. Да этим функциям 100 лет в обед, они всегда были потокобезопасны, как только появились потоки и многопоточные версии CRT. Другое дело, что ТОЛЬКО СЕЙЧАС (в C++11) этот факт зафиксирован в стандарте как требование (там требование НЕ ТОЛЬКО потоко безопасности, но и относительной упорядоченности вызовов к ним, на сколько я понял из краткого прочтения статьи). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 16:58 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Так и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно? Будут потокобезопасны. А что насчет memcpy? НЕ БУДЕТ потокобезопасна. В том смысле, что с одной памятью в разных потоках оперировать ею нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 17:00 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
MasterZiv0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую. (чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно) Это потому что в копируемой области можно использовать только POD- объекты? У меня как раз такой случай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 17:06 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
MasterZivТак и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно? Будут потокобезопасны. А что насчет memcpy? НЕ БУДЕТ потокобезопасна. В том смысле, что с одной памятью в разных потоках оперировать ею нельзя. Спасибо! Разумеется memcpy в разных потоках будет копировать разную память (каждый поток делает что-то для себя). Я про то, что некоторые функции хранят свое состояние, и их вызов из разных потоков может привести к ошибке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 17:09 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLMasterZiv0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую. (чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно) Это потому что в копируемой области можно использовать только POD- объекты? У меня как раз такой случай. Я написал почему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 10:07 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
MasterZiv0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую. (чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно) Ну полнейшая же чушь. Выделена у меня гора памяти, и надо довыделить еще пару байт. И что, мне не пытаться сделать мгновенный реаллок? Сразу снова выделять, копировать и освобождать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 19:07 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockMasterZiv0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую. (чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно) Ну полнейшая же чушь. Выделена у меня гора памяти, и надо довыделить еще пару байт. И что, мне не пытаться сделать мгновенный реаллок? Сразу снова выделять, копировать и освобождать? реаллок что по твоему должен делать? Вжух и память появилась? Про адресное пространство не забывай: например тебе выделили память с адреса 0 по 100500, а с адреса 100501 выделили еще кому-то, и тут ты просишь еще 10 байт ... , но тебе же надо не 10 байт а непрерывный кусок 100510 байт, поэтому копирование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 20:13 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima Tнапример тебе выделили память с адреса 0 по 100500, а с адреса 100501 выделили еще кому-то А если не выделили? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 20:20 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockDima Tнапример тебе выделили память с адреса 0 по 100500, а с адреса 100501 выделили еще кому-то А если не выделили? Может и так, но спросить "так или не так" не у кого. Работа менеджера памяти не документирована. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 20:28 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TМожет и так, но спросить "так или не так" не у кого. Работа менеджера памяти не документирована. Именно есть у кого. Для этого и предназначен realloc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 22:24 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Никто не забыл, что память выделяется страницами, да еще и с виртуализацией страниц? Пока в странице, вообще нет проблем расшириться. А если нет - то дописать процессору в табличку аллокаций VM линейное расширение (я не настолько ос разработчик, но АФАИК, это тоже небольшая проблема) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 22:50 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
на уровне ЦПУ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 22:52 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
SiemarglНикто не забыл, что память выделяется страницами, да еще и с виртуализацией страниц? Пока в странице, вообще нет проблем расшириться.Это у системы память запрашивается страницами. Диспетчер памяти в приложении оперирует более мелкими блоками - байт этак по восемь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 23:46 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovSiemarglНикто не забыл, что память выделяется страницами, да еще и с виртуализацией страниц? Пока в странице, вообще нет проблем расшириться.Это у системы память запрашивается страницами. Диспетчер памяти в приложении оперирует более мелкими блоками - байт этак по восемь.Даже если бы это было правдой, то шанс довыделить память реаллоком (для указателя - обычная задача) без перевыделения/копирования/освобождения, был бы равен 50%. Что в 2 раза производительнее. Не знаю, как там по версиям сей, но: 1. В старых делфях менеджер резервирует константу, которую можно задать; 2. В Win10 вообще ИИ - вначале резервируется 128, потом килобайт, потом 10, потом не знаю - это я на глаз проверил. Это дает прирост производительности в сотни-тысячи раз при использовании GlobalRealloc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2017, 02:25 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockДаже если бы это было правдой, Это лехко проверить. Например тут или тут . В общем случае эффективность realloc сильно зависит выбранного от менеджера памяти. ИМХО использование realloc - плохая практика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2017, 04:17 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockBasil A. SidorovДиспетчер памяти в приложении оперирует более мелкими блоками - байт этак по восемь.Даже если бы это было правдойВы правда думаете, что вектор из миллиона указателей на килобайтовый буфер получит по отдельной странице на каждый буфер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2017, 22:23 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovYuRockпропущено... Даже если бы это было правдойВы правда думаете, что вектор из миллиона указателей на килобайтовый буфер получит по отдельной странице на каждый буфер?Мне это безразлично. Я не думаю, а знаю, что в менеджерах памяти, которыми я пользуюсь, realloc возвращает (мгновенно) не NULL в подавляющем большинстве случаев. И проверка "на всякий случай" с долгим перевыделением и копированием может вообще никогда не отработать за время жизни программы, а если и отрабатывает - то крайне редко. Зависит от размера довыделяемой памяти. Например, если по 512 байт довыделяю - то 1 раз из 10, по 10кб - 3 раза из 10, по 4 байта - 0 раз из 100. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2017, 22:44 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockМне это безразлично.А зря. Интуиция - плохой советчик. P.S. Копирование десятка мегабайт занимает единицы миллисекунд на не самых быстрых процах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2017, 22:51 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovА зря. Интуиция - плохой советчик.Какая интуиция? Я говорил о реальных фактах. Basil A. SidorovКопирование десятка мегабайт занимает единицы миллисекунд на не самых быстрых процахКак-то скромно упущено количество миллисекунд, необходимое для выделения и освобождения указателя для десятков мегабайт. P.S. Копирование пройдет быстро, если память уже реально выделена, а не только указатель на нее дан. А когда при копировании она только реально выделяться начнет, то дело будет станет далеко не только в скорости проца, а и физ. кол-ве памяти, и в винте, и в чем угодно еще, в той же загруженности проца, винта... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 03:10 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovединицы миллисекунд на не самых быстрых процахА в цикле постоянно если это происходит - надо, значит, "самые быстрые процы" покупвть, чтобы программа работала без тормозов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 03:14 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockP.S. Копирование пройдет быстро, если память уже реально выделенаДля realloc есть какой-то другой сценарий?А когда при копировании она только реально выделяться начнет, то дело будет станет далеко не только в скорости проца, а и физ. кол-ве памяти, и в винте, и в чем угодно еще, в той же загруженности проца, винта..."А ты не путай свою шерсть с государственной" (ц) кинокомедия "Кавказская пленница". Есть запросы памяти у системы (делаются большими блоками) и есть работа *alloc в приложении. Вот последние оперируют блоками с гранулярностью в единицы байт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 03:15 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockА в цикле постоянно если это происходит - надо, значит, "самые быстрые процы" покупвть, чтобы программа работала без тормозов?Можно просто нанять программиста более высокой квалификации. Который сумеет реализовать более адекватный алгоритм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 03:17 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39559277&tid=2018035]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
155ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 267ms |

| 0 / 0 |
