2013-05-28 6 views
1

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

Мой текущий плагин имеет два потока: главный, который является нитью приложения, и другой, который используется для обработки данных основного потока. Короче говоря, первый создает объекты, дает им идентификатор, вставляет их в карту, а иногда даже получает доступ и удаляет их (если приложение говорит так); второй - считывает данные с этой карты и изменяет объекты.

Мой вопрос: какие технологии я могу использовать, чтобы сделать мой плагин потокобезопасным?

+0

Основной поток, разрешенный для удаления объекта, когда рабочий поток работает над ним? – japreiss

+0

Я бы посчитал ссылку на доступ к отдельным объектам (если первый поток не изменил их) и мьютекс, чтобы защитить карту (вставить новые элементы). Подсчет ссылок увеличивается для вставки и для доступа к второй нити и уменьшается для удаления, а второй - завершает работу. Когда значение count достигает 0, объект (авто) удаляет себя. – Liviu

+0

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

ответ

5

Во-первых, вы должны определить, где может существовать race conditions. Затем вам нужно будет использовать какой-то механизм, чтобы обеспечить доступ к общим данным безопасным образом, следовательно, достижение Thread Safety.

Для вашего конкретного случая кажется, что состояние гонки будет на общей карте и, возможно, в объектах (значениях карты), которые она содержит (если возможно, что оба потока пытаются изменить один и тот же объект одновременно).

Мое предложение состоит в том, что вы используете хорошо протестированную реализацию реализаций потоковой сети, а затем при необходимости добавьте дополнительную «защиту» для самих значений карты. Таким образом, вы гарантируете, что карта всегда находится в согласованном состоянии для обоих потоков, и если оба потока попытаются изменить одни и те же данные объекта (значения карты), данные не будут повреждены или останутся несогласованными.

Для самой карты вы можете искать структуры данных «Concurrent Hash Map» или «Atomic Hash Map» для C++ и посмотреть, обладают ли они хорошего качества и доступны для вашего компилятора/платформы. Хорошими примерами являются Intel TBBconcurrent_hash_map или Facebook follyAtomicHashMap. У них обоих есть преимущества и недостатки, и вам нужно будет проанализировать, что лучше для вашей ситуации.

Что касается объектов, которые содержит карта, вы можете использовать простые мьютексы (простые, блокировки, изменения данных, разблокировки), атомные операции (сложнее, только для простых типов данных) или другой метод, еще раз в зависимости от вашего компилятора/платформы и требования к скорости.

Надеюсь, это поможет!

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