2014-10-15 4 views
9

Я уверен, что на практике использование ::new является потокобезопасным. Мой вопрос заключается в том, какая часть стандарта обеспечивает эту гарантию, если таковая имеется? Это конвенция? Является ли это чем-то, где стандарт дает реализаций много широты (например, относительно свободные ограничения на размер каждого типа данных) для поддержки широкого спектра аппаратного обеспечения?Безопасность потоков :: new в C++ 11

Я надеюсь, что в стандарте C++ 11 есть только строка, которая явно указывает, что «реализация ::new должна быть потокобезопасной».

Я также хотел бы увидеть некоторые стандартизированные сведения о безопасности потоков новых рабочих перегрузок. Я полагаю, что они также должны были быть обязательными, чтобы быть потокобезопасными, но эти функции также не подпадают под гарантию на одеяло, что const => thread safe (в C++ 11).

Спасибо!

+0

Почему стандарт гарантирует, что вы перегружаете _your_ 'operator new' потоком? Ваша программа, ваши проблемы. – MSalters

+0

@MSalters - по той же причине, что и const => thread-safe. Потому что, не гарантируя гарантии в коде, вы не можете безопасно взаимодействовать со стандартной библиотекой. Можете ли вы стрелять в ногу? Да, как и все что угодно на C++ ... но это почти не имеет значения. – Mark

ответ

9

Я считаю, что это неявно гарантируется стандартом C++ 11. Если бы это было не так, использование нового или нового выражения оператора могло бы привести к гонке данных, и это не было бы допустимо стандартом. Для справки см §17.6.5.9 предотвращения гонки данных, а также

18.6.1.4 гонки данных [new.delete.dataraces]

«Библиотечные версий оператора нового и оператора удаления, замены пользователя версии глобального оператора new и оператор delete, а стандартные функции библиотеки C calloc, malloc, realloc и free не должны вводить расы данных (1.10) в результате одновременных вызовов из разных потоков. Вызывает эти функции, которые выделяют или освобождают конкретная единица хранения должна выполняться в одном общем порядке, и каждый такой вызов освобождения должен произойти до следующего распределения (если есть) в этом порядке ».

Ваши собственные переопределения или ваши собственные замены для глобальных операторов должны выполнить это требование.

См. Также proposal N3664 "Clarifying Memory Allocation", что делает больший акцент на этом вопросе.

2

Стандарт C++ не требует, чтобы new был потокобезопасным. Некоторые реализации явно поддерживают построение кода C++ в однопоточном режиме, где стандартная библиотека C, включая mallloc(), может быть небезопасной для потоков. Конечно, платформы, которые большинство из нас используют каждый день, действительно предлагают потокобезопасное размещение.

Даже если ваша платформа обеспечивает поточный new, вам все равно нужно быть осторожным, если вы используете библиотеки, которые реализуют свои собственные operator new, или если вы сделаете это самостоятельно. Можно, конечно, написать new, который работает только в одном потоке - возможно, даже преднамеренно!

Смежные вопросы