boost :: thread и модель памяти - PullRequest
2 голосов
/ 15 июля 2011

Предположим, у меня есть немного многопоточного кода на плите котла, например как ниже. Мне было интересно, какие гарантии (если таковые имеются) существуют, что несколько потоков, использующих этот код, всегда будут видеть текущую версию состояния. Я знаю, что C ++ гарантирует очень мало о модели памяти, и я думаю, что где-то читал, что даже объявление состояния volatile может не помочь. Тем не менее, на практике люди с удовольствием используют boost :: thread, и его документация не сопровождается большим предупреждением о том, что мьютексы бесполезны, если вы не используете только внешнее состояние :-) Я предполагаю, что за кулисами должна быть какая-то магия, которую Boost делает за кулисами , или я должен вызывать __sync_synchronize () каждый раз, когда я что-то делаю?

class Blah {
    typedef (some horribly complex data structure) State;
    State state;
    boost::mutex m;

(...)

    void use ()
    {
        boost::lock_guard<boost::mutex> dummy (m);
        (do something to state, being especially careful to maintain invariants)
    }
};

1 Ответ

1 голос
/ 15 июля 2011

Mutex блокировка / разблокировка подразумевает барьер памяти.(Хотя я не могу найти это в документации boost :: mutex, я гарантирую, что это указано где-то в документации для каждой реализации мьютекса, на которую опирается Boost.)

Этот код в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...