У меня есть класс, представляющий различные виды инструментов (GCC, LEX, YACC, ...). Каждому экземпляру присваивается тип, представляющий инструмент, и разрешается специальная конфигурация.Правильный способ реализации поточно-безопасного метода в C++ 11
Чтобы обрабатывать конфигурацию по умолчанию, у меня есть набор карт и вектор, сохраняющий значения по умолчанию. Как я хочу, чтобы класс, который будет использоваться в любом контексте, она должна была бы быть поточно-, таким образом, чтобы избежать гонки я осуществил следующее:
int Tool::addType(std::string typeName,
std::string typeFlagName)
throw (GP::Exceptions::LockAcquisitionException)
{
static std::timed_mutex mutex;
std::unique_lock<std::timed_mutex> lock{mutex};
int typeId = 0;
if (lock.try_lock_for(std::chrono::microseconds(100)))
{
int typeId = typeNames.size();
typeNames[typeId] = typeName;
typeFlagNames[typeId] = typeFlagName;
}
else
{
throw GP::Exceptions::LockAcquisitionException{"Unable to generate new type ID within 100 microseconds."};
}
return typeId;
}
Я хотел бы знать, если это хорошее решение, или если Я что-то упускаю. Если это нормально, есть ли другое решение, менее подробное?
Это предотвратит два отдельных потока от добавления типов в то же время, но он * не * предотвратить одну нити от добавления типа в то же время, как другой поток, пытается получить тип. Это кажется мне небезопасным. , , – ruakh
Я согласен с руахом. У вас должен быть только элемент std :: mutex для всего объекта и каждого вызова участника. Затем просто используйте простой std :: lock_guard вместо того, чтобы обманывать таймер. – Lalaland
Типы не будут изменены, только один будет добавлен. Доступ к чтению не приведет к состоянию гонки. – Geoffroy