Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Насколько я понял malloc и realloc не являются потокобезопасными. Поэтому надо использовать new / delete, но у этого паттерна нет перевыделения памяти! Например, мне не хватило куска в тысячу байт и я хочу выделить кусок на 2 тысячи байт с переносом туда всех данных из первого куска. Как такое сделать потокобезопасно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 12:35 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНасколько я понял malloc и realloc не являются потокобезопасными. Откуда инфа? Они потокобезопасны. http://en.cppreference.com/w/c/memory/realloc realloc is thread-safe: it behaves as though only accessing the memory locations visible through its argument, and not any static storage. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 12:43 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНасколько я понял malloc и realloc не являются потокобезопасными. Поэтому надо использовать new / delete, но у этого паттерна нет перевыделения памяти! Например, мне не хватило куска в тысячу байт и я хочу выделить кусок на 2 тысячи байт с переносом туда всех данных из первого куска. Как такое сделать потокобезопасно? Если это не уровень детсада (а выделенное говорит скорее о ясельной группе), то через mmap() можно замапить один и тот-же файл в несколько разных мест, в т.ч. и с увеличением размера мапы. Т.е. адреса будут разные, а по факту участок памяти - один. Но для двух килобайт дергать mmap() - это уж точно, из гаубицы по муравьям ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 12:57 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TAlekseySQLНасколько я понял malloc и realloc не являются потокобезопасными. Откуда инфа? Они потокобезопасны. http://en.cppreference.com/w/c/memory/realloc realloc is thread-safe: it behaves as though only accessing the memory locations visible through its argument, and not any static storage. там говорится что можно просто вызывать realloc в разных потоках, но речь о другом - падавану похоже нужно реаллоцировать кусок памяти, в который идет конкурентный доступ. хотя на самом деле поди пойми, что именно нужно - с фрагментарной базовой подготовкой идти в потоки - это очень смелый шаг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 13:01 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TОткуда инфа? Они потокобезопасны. http://en.cppreference.com/w/c/memory/realloc realloc is thread-safe: it behaves as though only accessing the memory locations visible through its argument, and not any static storage. Тут http://en.cppreference.com/w/cpp/memory/c/malloc говорится, что они потокобезопасны только с С++17 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:13 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
dbpatchтам говорится что можно просто вызывать realloc в разных потоках, но речь о другом - падавану похоже нужно реаллоцировать кусок памяти, в который идет конкурентный доступ. хотя на самом деле поди пойми, что именно нужно - с фрагментарной базовой подготовкой идти в потоки - это очень смелый шаг. Падаван хочет то, что написал в топике: из разных потоков параллельно выделять/перевыделять/освобождать куски памяти. Заполнение данными будет происходить в каждом потоке в отдельный кусок памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:16 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLDima TОткуда инфа? Они потокобезопасны. пропущено... Тут http://en.cppreference.com/w/cpp/memory/c/malloc говорится, что они потокобезопасны только с С++17 Не нашел такого по ссылке. Потокобезопасность определяется используемым рантаймом https://stackoverflow.com/questions/855763/is-malloc-thread-safe To that question the answer is it depends on your runtime library, and possibly on the compiler flags you use. On any modern UNIX you'll get a thread-safe malloc by default. On Windows, use /MT, /MTd, /MD or /MDd flags to get thread-safe runtime library. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:33 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TНе нашел такого по ссылке. авторThe following functions are required to be thread-safe: The library versions of operator new and operator delete User replacement versions of global operator new and operator delete std::calloc, std::malloc, std::realloc, std::aligned_alloc (since C++17) Calls to these functions that allocate or deallocate a particular unit of storage occur in a single total order, and each such deallocation call happens-before the next allocation (if any) in this order. Ну да, thread-safe определяется реализациямифункций, которые вызываются из библиотек: если они написаны с учетом многопоточности, то все будет ок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:47 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLDima TНе нашел такого по ссылке. авторThe following functions are required to be thread-safe: The library versions of operator new and operator delete User replacement versions of global operator new and operator delete std::calloc, std::malloc, std::realloc, std::aligned_alloc (since C++17) Calls to these functions that allocate or deallocate a particular unit of storage occur in a single total order, and each such deallocation call happens-before the next allocation (if any) in this order. Ну да, thread-safe определяется реализациямифункций, которые вызываются из библиотек: если они написаны с учетом многопоточности, то все будет ок. Как понимаю (since C++17) относится только к std::aligned_alloc, т.к. в более ранних стандартах ее нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:54 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TКак понимаю (since C++17) относится только к std::aligned_alloc, т.к. в более ранних стандартах ее нет. Обычно подобные ограничения указывают для целой строки (потому что в строках не смешивают разнокачественные данные). Можно и тут посмотреть: https://stackoverflow.com/questions/855763/is-malloc-thread-safe ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:59 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLТут http://en.cppreference.com/w/cpp/memory/c/malloc говорится, что они потокобезопасны только с С++17 Во-первых, не говорится. Во-вторых, не путай std::calloc и ::calloc. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:04 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLDima TКак понимаю (since C++17) относится только к std::aligned_alloc, т.к. в более ранних стандартах ее нет. Обычно подобные ограничения указывают для целой строки (потому что в строках не смешивают разнокачественные данные). Можно и тут посмотреть: https://stackoverflow.com/questions/855763/is-malloc-thread-safe Про эту ссылку я уже написал 20956223 , там в ответах написано что определяется рантаймом, т.е. в многопоточных рантаймах потокобезопасные malloc(), realloc() и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:19 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Можешь еще сюда глянуть http://en.cppreference.com/w/c/memory/malloc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:20 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TПро эту ссылку я уже написал 20956223 , там в ответах написано что определяется рантаймом, т.е. в многопоточных рантаймах потокобезопасные malloc(), realloc() и т.д. Не знаю, что вы подразумеваете под словом "рантайм". Я понимаю так: если библиотека написано с учетом многопоточной работы, то она потокобезопасна. Если же запустить функцию, написанную без учета многопоточности, в многопоточном приложении, то само- собой ничего потокобезопасным не станет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:24 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLОбычно подобные ограничения указывают для целой строки Но если ты присмотришься внимательнее, то на данном конкретном ресурсе релевантный кусок выделяют прямоугольным блоком с тонкой малозаметной рамочкой. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:32 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLDima TПро эту ссылку я уже написал 20956223 , там в ответах написано что определяется рантаймом, т.е. в многопоточных рантаймах потокобезопасные malloc(), realloc() и т.д. Не знаю, что вы подразумеваете под словом "рантайм". Я понимаю так: если библиотека написано с учетом многопоточной работы, то она потокобезопасна. Если же запустить функцию, написанную без учета многопоточности, в многопоточном приложении, то само- собой ничего потокобезопасным не станет. "рантайм" это сам С/С++, он тоже библиотека, где прописаны функции, в т.ч. malloc(). При компиляции ты выбираешь многопоточный рантайм использовать или однопоточный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:33 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TAlekseySQLпропущено... Не знаю, что вы подразумеваете под словом "рантайм". Я понимаю так: если библиотека написано с учетом многопоточной работы, то она потокобезопасна. Если же запустить функцию, написанную без учета многопоточности, в многопоточном приложении, то само- собой ничего потокобезопасным не станет. "рантайм" это сам С/С++, он тоже библиотека, где прописаны функции, в т.ч. malloc(). При компиляции ты выбираешь многопоточный рантайм использовать или однопоточный. я могу конечно ошибаться, но возможность указать /ML в Visual Studio выпилили еще 12 лет назад. или нет? про линукс и прочих POSIX тоже конечно было бы прикольно узнать, как вообще можно указать в опциях потоко-небезопасный realloc() расскажешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:42 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima T"рантайм" это сам С/С++, он тоже библиотека, где прописаны функции, в т.ч. malloc(). При компиляции ты выбираешь многопоточный рантайм использовать или однопоточный. Не думаю, что сам С/С++ внутри себя реализует стандартные функции. Для этого используются отдельные библиотеки, которые подключаются в программу с помощью директив препроцессору #include. И вот именно эти реализации библиотек определяют возможность многопоточной работы (а не факт запуска компиляции с какими- либо ключами). Например, по вашей ссылке видно, что malloc требует библиотеки <stdlib.h>. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:49 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLDima TПро эту ссылку я уже написал 20956223 , там в ответах написано что определяется рантаймом, т.е. в многопоточных рантаймах потокобезопасные malloc(), realloc() и т.д. Не знаю, что вы подразумеваете под словом "рантайм". Я понимаю так: если библиотека написано с учетом многопоточной работы, то она потокобезопасна. Если же запустить функцию, написанную без учета многопоточности, в многопоточном приложении, то само- собой ничего потокобезопасным не станет. 1) в современном мире принято правило - в С runtime (C standard library) - фукнции потокобезопасны, если не оговорено иное. более подробно тут: http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_09_01 2) для win32 нужно отдельно искать, естественно. там вообще ИМНИП все с точностью до наоборот - все считается небезопасным, если не оговорена безопасность. хотя на пересечении POSIX и Win32 наверное справедливо первое правило ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:50 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
dbpatchDima Tпропущено... "рантайм" это сам С/С++, он тоже библиотека, где прописаны функции, в т.ч. malloc(). При компиляции ты выбираешь многопоточный рантайм использовать или однопоточный. я могу конечно ошибаться, но возможность указать /ML в Visual Studio выпилили еще 12 лет назад. или нет? про линукс и прочих POSIX тоже конечно было бы прикольно узнать, как вообще можно указать в опциях потоко-небезопасный realloc() расскажешь? ХЗ какой у него компилятор. Написал про общий случай, вдруг какая-нибудь экзотика используется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:55 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Ага, все проше. Есть CRT. И single-threaded CRT больше не доступен https://docs.microsoft.com/en-gb/cpp/c-runtime-library/multithreaded-libraries-performance и даже больше - Microsoft даже некоторые изначально потоко-небезопасные фукции переделала в безопасные: https://docs.microsoft.com/en-gb/cpp/c-runtime-library/reference/strtok-strtok-l-wcstok-wcstok-l-mbstok-mbstok-l в линаксе это не так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:58 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima Tdbpatchпропущено... я могу конечно ошибаться, но возможность указать /ML в Visual Studio выпилили еще 12 лет назад. или нет? про линукс и прочих POSIX тоже конечно было бы прикольно узнать, как вообще можно указать в опциях потоко-небезопасный realloc() расскажешь? ХЗ какой у него компилятор. Написал про общий случай, вдруг какая-нибудь экзотика используется. при чем тут компилятор? runtime это библиотека. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 16:00 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
dbpatchАга, все проше. Есть CRT. И single-threaded CRT больше не доступен https://docs.microsoft.com/en-gb/cpp/c-runtime-library/multithreaded-libraries-performance и даже больше - Microsoft даже некоторые изначально потоко-небезопасные фукции переделала в безопасные: https://docs.microsoft.com/en-gb/cpp/c-runtime-library/reference/strtok-strtok-l-wcstok-wcstok-l-mbstok-mbstok-l в линаксе это не так Я как раз под Линаксом сижу :) Так и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно? А что насчет memcpy? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 16:32 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLЯ как раз под Линаксом сижу :) Так и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно? Как минимум это ожидается. Qt вообще перекрывают собой все что можно, если что не так - читай их доку, пиши в саппорт. AlekseySQLА что насчет memcpy? А что с ним не так? Он изначально потокобезопасный, ибо не имеет состояния между вызовами. Там только нужно ГАРАНТИРОВАТЬ, что области не пересекаются, иначе использовать memmove животрепещущее тут: http://avva.livejournal.com/2323823.html#/2323823.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 16:49 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНасколько я понял malloc и realloc не являются потокобезопасными. 0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую. (чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно) 1) malloc, realloc являются потокобезопасными. 2) в C++ вообще нужно использовать std::vector ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 16:52 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39553630&tid=2018035]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
92ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 209ms |

| 0 / 0 |
