C 11에서 'const'를 사용하면 스레드가 보장된다고 널리 알려져 있습니다. 안전. 그러나 이 개념에는 추가 설명이 필요합니다.
'const'만으로는 스레드 안전성을 보장할 수는 없지만 'const' 개체에 대한 작업은 스레드 안전성을 보장한다는 표준 라이브러리의 기대를 충족합니다. 안전한. 구체적으로:
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; } };
쓰기 시 스레드 안전성을 위해 '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 중국어 웹사이트의 기타 관련 기사를 참조하세요!