Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как в многопоточной программе ПЕРЕвыделять память? / 25 сообщений из 101, страница 1 из 5
15.11.2017, 12:35
    #39553385
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
Насколько я понял malloc и realloc не являются потокобезопасными.

Поэтому надо использовать new / delete, но у этого паттерна нет перевыделения памяти! Например, мне не хватило куска в тысячу байт и я хочу выделить кусок на 2 тысячи байт с переносом туда всех данных из первого куска. Как такое сделать потокобезопасно?
...
Рейтинг: 0 / 0
15.11.2017, 12:43
    #39553391
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
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.
...
Рейтинг: 0 / 0
15.11.2017, 12:57
    #39553402
dbpatch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
AlekseySQLНасколько я понял malloc и realloc не являются потокобезопасными.

Поэтому надо использовать new / delete, но у этого паттерна нет перевыделения памяти! Например, мне не хватило куска в тысячу байт и я хочу выделить кусок на 2 тысячи байт с переносом туда всех данных из первого куска. Как такое сделать потокобезопасно?

Если это не уровень детсада (а выделенное говорит скорее о ясельной группе), то через mmap() можно замапить один и тот-же файл в несколько разных мест, в т.ч. и с увеличением размера мапы.

Т.е. адреса будут разные, а по факту участок памяти - один.

Но для двух килобайт дергать mmap() - это уж точно, из гаубицы по муравьям
...
Рейтинг: 0 / 0
15.11.2017, 13:01
    #39553405
dbpatch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
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 в разных потоках, но речь о другом - падавану похоже нужно реаллоцировать кусок памяти, в который идет конкурентный доступ.

хотя на самом деле поди пойми, что именно нужно - с фрагментарной базовой подготовкой идти в потоки - это очень смелый шаг.
...
Рейтинг: 0 / 0
15.11.2017, 14:13
    #39553534
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
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
...
Рейтинг: 0 / 0
15.11.2017, 14:16
    #39553538
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
dbpatchтам говорится что можно просто вызывать realloc в разных потоках, но речь о другом - падавану похоже нужно реаллоцировать кусок памяти, в который идет конкурентный доступ.

хотя на самом деле поди пойми, что именно нужно - с фрагментарной базовой подготовкой идти в потоки - это очень смелый шаг.

Падаван хочет то, что написал в топике: из разных потоков параллельно выделять/перевыделять/освобождать куски памяти. Заполнение данными будет происходить в каждом потоке в отдельный кусок памяти.
...
Рейтинг: 0 / 0
15.11.2017, 14:33
    #39553560
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
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.
...
Рейтинг: 0 / 0
15.11.2017, 14:47
    #39553573
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
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 определяется реализациямифункций, которые вызываются из библиотек: если они написаны с учетом многопоточности, то все будет ок.
...
Рейтинг: 0 / 0
15.11.2017, 14:54
    #39553586
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
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, т.к. в более ранних стандартах ее нет.
...
Рейтинг: 0 / 0
15.11.2017, 14:59
    #39553591
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
Dima TКак понимаю (since C++17) относится только к std::aligned_alloc, т.к. в более ранних стандартах ее нет.

Обычно подобные ограничения указывают для целой строки (потому что в строках не смешивают разнокачественные данные).

Можно и тут посмотреть: https://stackoverflow.com/questions/855763/is-malloc-thread-safe
...
Рейтинг: 0 / 0
15.11.2017, 15:04
    #39553596
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
AlekseySQLТут http://en.cppreference.com/w/cpp/memory/c/malloc говорится, что они потокобезопасны
только с С++17

Во-первых, не говорится. Во-вторых, не путай std::calloc и ::calloc.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.11.2017, 15:19
    #39553618
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
AlekseySQLDima TКак понимаю (since C++17) относится только к std::aligned_alloc, т.к. в более ранних стандартах ее нет.

Обычно подобные ограничения указывают для целой строки (потому что в строках не смешивают разнокачественные данные).

Можно и тут посмотреть: https://stackoverflow.com/questions/855763/is-malloc-thread-safe
Про эту ссылку я уже написал 20956223 , там в ответах написано что определяется рантаймом, т.е. в многопоточных рантаймах потокобезопасные malloc(), realloc() и т.д.
...
Рейтинг: 0 / 0
15.11.2017, 15:20
    #39553619
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
Можешь еще сюда глянуть http://en.cppreference.com/w/c/memory/malloc
...
Рейтинг: 0 / 0
15.11.2017, 15:24
    #39553624
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
Dima TПро эту ссылку я уже написал 20956223 , там в ответах написано что определяется рантаймом, т.е. в многопоточных рантаймах потокобезопасные malloc(), realloc() и т.д.

Не знаю, что вы подразумеваете под словом "рантайм". Я понимаю так: если библиотека написано с учетом многопоточной работы, то она потокобезопасна. Если же запустить функцию, написанную без учета многопоточности, в многопоточном приложении, то само- собой ничего потокобезопасным не станет.
...
Рейтинг: 0 / 0
15.11.2017, 15:32
    #39553630
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
AlekseySQLОбычно подобные ограничения указывают для целой строки

Но если ты присмотришься внимательнее, то на данном конкретном ресурсе релевантный кусок
выделяют прямоугольным блоком с тонкой малозаметной рамочкой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.11.2017, 15:33
    #39553633
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
AlekseySQLDima TПро эту ссылку я уже написал 20956223 , там в ответах написано что определяется рантаймом, т.е. в многопоточных рантаймах потокобезопасные malloc(), realloc() и т.д.

Не знаю, что вы подразумеваете под словом "рантайм". Я понимаю так: если библиотека написано с учетом многопоточной работы, то она потокобезопасна. Если же запустить функцию, написанную без учета многопоточности, в многопоточном приложении, то само- собой ничего потокобезопасным не станет.
"рантайм" это сам С/С++, он тоже библиотека, где прописаны функции, в т.ч. malloc(). При компиляции ты выбираешь многопоточный рантайм использовать или однопоточный.
...
Рейтинг: 0 / 0
15.11.2017, 15:42
    #39553641
dbpatch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
Dima TAlekseySQLпропущено...


Не знаю, что вы подразумеваете под словом "рантайм". Я понимаю так: если библиотека написано с учетом многопоточной работы, то она потокобезопасна. Если же запустить функцию, написанную без учета многопоточности, в многопоточном приложении, то само- собой ничего потокобезопасным не станет.
"рантайм" это сам С/С++, он тоже библиотека, где прописаны функции, в т.ч. malloc(). При компиляции ты выбираешь многопоточный рантайм использовать или однопоточный.

я могу конечно ошибаться, но возможность указать /ML в Visual Studio выпилили еще 12 лет назад. или нет?
про линукс и прочих POSIX тоже конечно было бы прикольно узнать, как вообще можно указать в опциях потоко-небезопасный realloc()

расскажешь?
...
Рейтинг: 0 / 0
15.11.2017, 15:49
    #39553649
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
Dima T"рантайм" это сам С/С++, он тоже библиотека, где прописаны функции, в т.ч. malloc(). При компиляции ты выбираешь многопоточный рантайм использовать или однопоточный.

Не думаю, что сам С/С++ внутри себя реализует стандартные функции. Для этого используются отдельные библиотеки, которые подключаются в программу с помощью директив препроцессору #include. И вот именно эти реализации библиотек определяют возможность многопоточной работы (а не факт запуска компиляции с какими- либо ключами).

Например, по вашей ссылке видно, что malloc требует библиотеки <stdlib.h>.
...
Рейтинг: 0 / 0
15.11.2017, 15:50
    #39553650
dbpatch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
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 наверное справедливо первое правило
...
Рейтинг: 0 / 0
15.11.2017, 15:55
    #39553656
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
dbpatchDima Tпропущено...

"рантайм" это сам С/С++, он тоже библиотека, где прописаны функции, в т.ч. malloc(). При компиляции ты выбираешь многопоточный рантайм использовать или однопоточный.

я могу конечно ошибаться, но возможность указать /ML в Visual Studio выпилили еще 12 лет назад. или нет?
про линукс и прочих POSIX тоже конечно было бы прикольно узнать, как вообще можно указать в опциях потоко-небезопасный realloc()

расскажешь?
ХЗ какой у него компилятор. Написал про общий случай, вдруг какая-нибудь экзотика используется.
...
Рейтинг: 0 / 0
15.11.2017, 15:58
    #39553660
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

в линаксе это не так
...
Рейтинг: 0 / 0
15.11.2017, 16:00
    #39553663
dbpatch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
Dima Tdbpatchпропущено...


я могу конечно ошибаться, но возможность указать /ML в Visual Studio выпилили еще 12 лет назад. или нет?
про линукс и прочих POSIX тоже конечно было бы прикольно узнать, как вообще можно указать в опциях потоко-небезопасный realloc()

расскажешь?
ХЗ какой у него компилятор. Написал про общий случай, вдруг какая-нибудь экзотика используется.

при чем тут компилятор? runtime это библиотека.
...
Рейтинг: 0 / 0
15.11.2017, 16:32
    #39553693
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
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?
...
Рейтинг: 0 / 0
15.11.2017, 16:49
    #39553716
dbpatch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
AlekseySQLЯ как раз под Линаксом сижу :)

Так и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно?
Как минимум это ожидается. Qt вообще перекрывают собой все что можно, если что не так - читай их доку, пиши в саппорт.


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

А что с ним не так? Он изначально потокобезопасный, ибо не имеет состояния между вызовами. Там только нужно ГАРАНТИРОВАТЬ, что области не пересекаются, иначе использовать memmove

животрепещущее тут:
http://avva.livejournal.com/2323823.html#/2323823.html
...
Рейтинг: 0 / 0
15.11.2017, 16:52
    #39553720
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в многопоточной программе ПЕРЕвыделять память?
AlekseySQLНасколько я понял malloc и realloc не являются потокобезопасными.

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

2) в C++ вообще нужно использовать std::vector
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как в многопоточной программе ПЕРЕвыделять память? / 25 сообщений из 101, страница 1 из 5
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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