두 개의 동시 스레드간에 공유되는 리소스가 있습니다. 리소스에는 두 스레드가 읽고 쓰는 데 필요한 벡터가 들어 있습니다. 따라서 뮤텍스를 통해 벡터 배타적 액세스 할 수 있습니다. 지금까지는 자원의 공유가 문제없이 잘 작동합니다.복사 생성자 관련 컴파일러 오류
그러나 sharedResource의 복사 생성자를 다음과 같이 작성하려고하면이 문제가 발생합니다. 이 코드에 대한
class sharedResource{
public:
sharedResource(){}
sharedResource(const sharedResource &other) {
vec = other.GetVec();
}
std::vector<int> GetVec() const {
std::lock_guard<std::mutex> lock(vecMutex); // Gives error
return vec;
}
private:
std::vector<int> vec;
std::mutex vecMutex;
};
int main()
{
sharedResource bacon1;
sharedResource bacon2 = bacon1;
return 0;
}
, 나는
error C2664: 'std::lock_guard<std::mutex>::lock_guard(const std::lock_guard<std::mutex> &)' : cannot convert argument 1 from 'const std::mutex' to 'std::mutex &'
당신은 내가 오류를 얻고있다 이유를 설명하고 컴파일러 오류가 발생하지 않고 뮤텍스를 사용하는 방법이 있는지 시겠어요 오류를 얻을.
그 밖의 모든 것이 실패하면 안전하지 않은 GetVec2 멤버 함수를 만들어 잠금 가드를 통과하지 않고 vec를 반환합니다. 그러나 나는 이러한 결말을 피하고자한다. getVec()
가 const
방법 일뿐 vecMutex
이 mutable
하지 않기 때문에
std::vector<int> GetVec2() const {
return vec;
}
뮤텍스를 '변경 가능'으로 선언하면 어떨까요? – PaulMcKenzie
@PaulMcKenzie는 그게 옵션인지 알지 못했습니다 –
mutex의 * copies *를 * 참고 *를 전달하는 코드를 검토하십시오. 참조를 다룰 때, 메소드의'const'-ness를 명심하십시오. –