2015-01-28 1 views
-1

У меня есть сервер приложений Singleton (предположим, что он создан правильно). Класс сервера имеет нестационарный векторный элемент, который модифицируется несколькими способами. Возможно ли, что компилятор оптимизирует код таким образом, что вектор модифицируется не поочередно по нескольким целям метода обработки запроса. Я имею в виду, могут ли две цепи вызовов методов пересекаться между разными запросами? Я думаю, они могут, потому что вызовы метода будут перескакивать на метки.Приложение Singleton с вектором-членом

+0

Нет. Однако очень возможно, что у вас есть несколько потоков, которые одновременно изменяют одни и те же данные. Поэтому вы должны защищать указанные данные с помощью Mutex. –

+0

@ FélixCantournet Если ваш ответ НЕТ, то зачем нужен мьютекст для синхронизации? Вектор является потокобезопасным. Я прошу сказать, что первый поток помещает объекты в singleton.vector_mem и второй поток удаляется, тогда они могут пересекать друг друга. – Asterisk

+0

Мой ответ «Нет», компилятор не может этого сделать ». Но вы, несомненно, можете это сделать. Вы говорите, что у вас есть состояние гонки, но вы, похоже, не знаете многопоточности, поэтому я просто укажу вам это. –

ответ

0

Хорошо, увидев ваши комментарии Я отправляю ответ, потому что что-то должно быть ясным: контейнеры std: не «threadsafe».

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

Что касается вашего вопроса: компилятор не виноват. Учитывая ваш комментарий, я полагаю, что у вас есть конкрементные записи и читается на вашем std :: vector, где у вас есть проблема прямо сейчас. Просто добавьте мьютекс и проверьте, не слишком ли ужасно. Если он ищет другую структуру данных/архитектуру.