Собираюсь ли я быть в порядке для потоков с STL, учитывая эти условия? - PullRequest
0 голосов
/ 13 июля 2009

У меня есть коллекция вида:

map<key, list<object> >

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

Насколько я понимаю, ни один из контейнеров STL не является поточно-ориентированным, но на самом деле я могу иметь максимум один поток на ключ. Я что-то упускаю, предполагая, что с этим соглашением я буду в безопасности?

Ответы [ 2 ]

7 голосов
/ 13 июля 2009

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

Старайтесь не искать ключи с помощью [], поскольку они будут вставлены (изменены), если ключ еще не существует на карте.

Однако мне любопытно, зачем вам нужна эта структура - почему бы не сохранить указатель / ссылку или сам объект списка в стеке каждого потока, учитывая, что он является закрытым для каждого потока?

(Если это не так, то вам нужна правильная синхронизация в списке.)

На самом деле вы говорите, что «читаете со всей карты» - возможно, это означает, что любой случайный поток может попытаться перебрать любой из списков. Поэтому вам обязательно нужно синхронизировать операции со списками.

1 голос
/ 13 июля 2009

TBH, если вы поместите критический раздел вокруг любой записи и прочитаете, она будет работать нормально.

...