2014-11-14 3 views
3

두 개의 동시 스레드간에 공유되는 리소스가 있습니다. 리소스에는 두 스레드가 읽고 쓰는 데 필요한 벡터가 들어 있습니다. 따라서 뮤텍스를 통해 벡터 배타적 액세스 할 수 있습니다. 지금까지는 자원의 공유가 문제없이 잘 작동합니다.복사 생성자 관련 컴파일러 오류

그러나 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 방법 일뿐 vecMutexmutable하지 않기 때문에

std::vector<int> GetVec2() const { 
    return vec; 
} 
+2

뮤텍스를 '변경 가능'으로 선언하면 어떨까요? – PaulMcKenzie

+0

@PaulMcKenzie는 그게 옵션인지 알지 못했습니다 –

+0

mutex의 * copies *를 * 참고 *를 전달하는 코드를 검토하십시오. 참조를 다룰 때, 메소드의'const'-ness를 명심하십시오. –

답변

6

발생합니다. getVec()을 non-const로 만들어서 뮤텍스를 수정 (획득)하거나 뮤텍스를 mutable으로 만들어 const 메소드로도 얻을 수 있도록해야합니다. 나는 아마 후자를 할 것이다.

+0

GCC에서 같은 오류가 발생했습니다 : 'std :: lock_guard :: lock_guard (const std :: mutex &)에 대한 호출과 일치하는 함수가 없습니다. – ShitalShah

4

빠른 대답은 vecMutex을 변경할 수있게하는 것입니다.

mutable std::mutex vecMutex; 

코드에 다른 비표준적인 문제가 있습니다. 기본 및 복사 생성자가 잘못 선언되었습니다. 다음과 같아야합니다.

sharedResource(){} 
sharedResource(const sharedResource &other) 
{ 
    vec = other.GetVec(); 
} 

할당 연산자도 없습니다.

+0

오류 텍스트에 대해 설명합니까? 나는 그것이 어떻게 관련되어 있는지 보려고 노력하고있다. – ThomasMcLeod

+0

즉,'lock_guard' 복사 생성자는 무엇입니까? – ThomasMcLeod

+0

@ThomasMcLeod - OP에서 게시 한 코드에는 두 가지 오류가 있습니다. 하나는 그가 알아 차린 코드이고 다른 하나는 컴파일러가 분명히 해결할 수있는 코드입니다. 제 대답의 두 번째 부분에서 제가 지적한 것이 후자입니다. – PaulMcKenzie