Можно ли считать метод get-method потокобезопасным, если не указано иное?

Можно ли вообще предполагать потокобезопасность для методов get, если иное не указано в документации метода? Или наоборот, никогда не следует предполагать потокобезопасность, если не указано иное? Что вы думаете?

Изменить:

Предположим, класс

class InfoClass {
  public:
    void Init();
    int  GetInfo();
    void Free();
};

Вызов Init() один раз, GetInfo() из контекста потока и Free() после завершения операций потока.


person Niklas R    schedule 25.07.2012    source источник


Ответы (4)


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

Объяснение:

Предположим, у вас есть getter для простого 64-битного long long, и вы работаете на 32-битной архитектуре. Пока компьютер извлекает вторую половину этого длинного 64-битного значения (только что выполненного с первой половиной), другой поток обновляет эту вторую половину, и теперь то, что у вас есть, является несогласованностью - таким образом, это не потокобезопасно.

Изменить (чтобы соответствовать редактированию в вопросе):

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

Если у вас нет никаких методов доступа, которые изменяют состояние вашего класса после его сборки, вы можете использовать потокобезопасность. Но это все еще небрежный наклон, так как позже кто-то, кто не знает о вашем предположении, может добавить setter в класс и совершить прекрасное путешествие в опыте отладки случайных ошибок;)

person YePhIcK    schedule 25.07.2012
comment
Упс, поправил частное. Спасибо за Ваш ответ! - person Niklas R; 25.07.2012
comment
В качестве альтернативы вы можете использовать struct вместо class, поскольку все члены struct по умолчанию являются public. - person YePhIcK; 25.07.2012

Я думаю, вы должны предположить, что метод not thread-safe, если не указано иное.

На самом деле я не вижу причин предполагать, что метод по умолчанию thread-safe.

person Andrew    schedule 25.07.2012

Метод get МОЖЕТ быть потокобезопасным, но опять же не обязательно. Если есть класс:

class A {
    int value;

    int getValue() {
        return value;
    }

    void processValue() {
        value += 2;
        value = value*2;
    }
}

В приведенном выше коде getValue явно не является потокобезопасным, поскольку он может быть вызван, когда другой поток находится во второй строке в processValue и, следовательно, переменная value находится в несогласованном состоянии. Итак, геттер здесь реентерабельный (опять же, это может быть не так), но все же не потокобезопасный.

Как уже упоминалось в этой теме, если не указано иное, предположим, что это не потокобезопасно.

person Rohan Prabhu    schedule 25.07.2012

Если переменная обновляется с использованием метода set, когда вы вызываете метод get, результатом будет мусор. Таким образом, если не указано иное, безопасность потоков не может быть принята.

person Asha    schedule 25.07.2012