> 백엔드 개발 > C++ > C 11의 `const`는 스레드 안전성을 보장합니까?

C 11의 `const`는 스레드 안전성을 보장합니까?

DDD
풀어 주다: 2024-12-20 20:59:10
원래의
861명이 탐색했습니다.

Does `const` in C  11 Guarantee Thread Safety?

C 11에서 'const'가 스레드 안전성을 의미합니까?

소개

C 11에서 'const'를 사용하면 스레드가 보장된다고 널리 알려져 있습니다. 안전. 그러나 이 개념에는 추가 설명이 필요합니다.

주장 명확화

'const'만으로는 스레드 안전성을 보장할 수는 없지만 'const' 개체에 대한 작업은 스레드 안전성을 보장한다는 표준 라이브러리의 기대를 충족합니다. 안전한. 구체적으로:

  • 'const'로 표시된 작업은 전적으로 읽기(쓰기 없음)로 구성되거나 내부적으로 쓰기를 동기화해야 합니다.
  • 표준 라이브러리는 자체 내 'const' 개체에 대한 모든 작업을 다음과 같이 가정합니다. 비경합이어야 합니다(const가 아닌 인수가 동시성을 처리하는 한).
  • 해당 유형에 대한 유형의 연산이 있는 경우 'const' 객체는 이러한 기대치를 위반합니다. 해당 유형을 표준 라이브러리와 함께 사용하면 데이터 경합 및 정의되지 않은 동작이 발생할 수 있습니다.

Const는 Java의 동기화와 같지 않습니다

Java의 '동기화, ' 'const'는 본질적으로 동기화를 제공하지 않습니다. 다음 예를 고려하십시오.

class rect {
    int width = 0, height = 0;

public:
    void set_size(int new_width, int new_height) {
        width = new_width;
        height = new_height;
    }
    int area() const {
        return width * height;
    }
};
로그인 후 복사
  • 'area()' 함수는 읽기만 하고 쓰기는 불가능하므로 스레드로부터 안전합니다.
  • 그러나 'Rect' 자체는 그렇지 않습니다. 'set_size()'에 의해 수행되는 쓰기 작업을 동기화하지 않기 때문에 스레드로부터 안전합니다.

조건부 스레드 안전 'const'

쓰기 시 스레드 안전성을 위해 'const'를 올바르게 활용하려면 아래에 설명된 것처럼 변경 가능한 상태(예: 캐시된 영역 값)를 동기화 프리미티브로 보호해야 합니다.

class rect {
    int width = 0, height = 0;

    mutable std::mutex cache_mutex;
    mutable int cached_area = 0;
    mutable bool cached_area_valid = true;

public:
    void set_size(int new_width, int new_height) {
        if (new_width != width || new_height != height) {
            std::lock_guard< std::mutex > guard(cache_mutex);
            cached_area_valid = false;
        }
        width = new_width;
        height = new_height;
    }
    int area() const {
        std::lock_guard< std::mutex > guard(cache_mutex);
        if (!cached_area_valid) {
            cached_area = width * height;
            cached_area_valid = true;
        }
        return cached_area;
    }
};
로그인 후 복사

'area()'가 스레드로부터 안전함에도 불구하고 'direct'는 보호되지 않은 쓰기로 인해 여전히 스레드로부터 안전하지 않은 상태로 유지됩니다. 'set_size()'.

키워드 부족

C 개발자가 키워드가 부족하다는 주장은 사실입니다. C 언어는 처음부터 제한된 수의 예약어를 사용했기 때문입니다.

위 내용은 C 11의 `const`는 스레드 안전성을 보장합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿