Обратите внимание, что C++ не определяет поточно-, но определяет гонки данных, которая является состоянием, которое возникает, когда несколько потоков доступа к одному объекту и по крайней мере один из них является писателем.
Вы можете использовать мьютексы, чтобы выполнять функции члена от std::list<>
данных гонки бесплатно. Вы можете даже сделать это для любого произвольного объекта с Wrapping C++ Member Function Calls technique by Bjarne Stroustrup. Это известно как внутренняя блокировка , что означает, что объект поддерживает свой собственный мьютекс.
Этот метод не обеспечивает утечку данных в пропущенных ссылках на внутреннее состояние объекта, например, ссылки, указатели и итераторы. Например, когда вы перебираете список, вы не хотите, чтобы другой поток аннулировал ваш итератор, удалив элемент, поэтому вам нужно будет заблокировать мьютекс до завершения итерации.
Кроме того, во многих полезных сценариях это более чем один объект, который необходимо изменить атомарно. В этом случае вам нужен один мьютекс, который сериализует доступ к нескольким объектам.
@Slava Очевидно, что функции-члены, которые указатели на утечки, ссылки и итераторы не могут быть потокобезопасными. Но вы даже не удосужились объяснить, почему, так что ваш комментарий близок к бесполезности. –
ОП спрашивает, может ли он сделать поток 'std :: list <>' потокобезопасным, почти весь доступ к данным в списке требует итератора (за исключением тривиальных случаев, таких как передняя и задняя), поэтому нет, вы не можете сделать поток std :: list' safe просто блокировка мьютексов внутри списка методов. – Slava
@Slava Это зависит от шаблона использования. Например, если 'std :: list <>' используется как очередь или стек, используются только 'push_back',' pop_front', 'pop_back'. –