Scott Meyers의 Effective Modern C++에서 Item 16을 읽습니다. 항목의 후반부에서 , 그는 하나의 변수 또는 메모리 위치는 mutex 또는 const 멤버 함수의 원자
는
std::atomic
의 사용이 적절한 동기화를 필요로하지만, 한 번 두 개 이상의 변수 나 같은 조작을 필요로 메모리 위치에 도착 말한다 단위가되면 에 도달해야합니다.
하지만 여전히 하나의 변수 또는 메모리 위치의 경우 적절한 이유를 참조하십시오이 항목에서 다항식 예를하지 않는
class Polynomial {
public:
using RootsType = std::vector<double>;
RootsType roots() const
{
if (!rootsAreValid) { // if cache not valid
.... // **very expensive compuation**, computing roots,
// store them in rootVals
rootsAreValid = true;
}
return rootVals;
}
private:
mutable std::atomic<bool> rootsAreValid{ false };
mutable RootsType rootVals{};
};
내 질문은 :
스레드 1이 많이 계산되는 중간에 rootAreValid
이 true
에 할당되고 스레드 2가 또한 함수 roots()
을 호출하고 rootAreValid
에서 false
까지 평가하면 스레드 2가 als가됩니다 o rootVals
의 무거운 계산에 대한 단계이므로,이 경우 원자 bool
의 적절한 방법은 무엇입니까? 나는 여전히 계산에 대한 입력을 보호하기 위해 std::lock_guard<mutex>
이 필요하다고 생각한다.
그것은 분명 충분하지 않다. 견적에 따르면 "단일 변수 나 메모리 위치가 동기화가 필요한 경우 ..."* – juanchopanza
@juanchopanza는 "동기화가 필요한 단일 변수 또는 메모리 위치의 경우"의 예가 아닙니다. – Allanqunzi
아니요, 벡터를 동기화해야합니다. – juanchopanza