2015-02-04 1 views
1

Я подозреваю, что в зависимости от поведения моего кода, если у меня есть boost :: thread_group, доступ к объекту, защищенному boost :: recursive_mutex, что мьютекс не предотвращает одновременный вход в защищенную область потоков изнутри группы.Все потоки в boost :: thread_group используют один и тот же поток в отношении boost :: recursive_mutex

Это сбивает с толку, потому что я вижу все потоки, перечисленные в отладчике (xcode).

Это известная проблема? Я не мог найти на нем никакой документации.

ответ

1

Повышение потока_группы представляет собой группу потоков.

Все потоки по определению отличаются и уникальны.


Таким образом, если мьютекс не может ... «мьютекс» (взаимно исключают), это указывает на ошибку программиста в другом месте.

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

Возможно, вы пропустили то, что все сторон, обращающихся к общим объектам/должны/приобретать мьютекс во все времена этих обращений. не хватает, чтобы один поток «охранял» общие объекты, чтобы магически сохранить другие потоки.

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

+0

Точно: мьютекс не защищает никакие переменные или значение или пространство памяти. Mutex - это набор дверей с одним ключом. Вы помещаете двери вокруг области, которую хотите защитить, и гарантируется, что только 1 нить может открывать любую дверь в любой момент. –

+0

Я думаю, что мое понимание мьютексов достаточно точно. –

+0

@JasonHarrison Хорошо! Разумеется, конечно, основываясь на немногих вещах, которые вы упомянули (это было неоднозначно, поэтому я верю вам, если вы скажете, что это так). Не стесняйтесь игнорировать эту часть. – sehe