2012-04-26 3 views
5

C++의 다른 스레드에서 작업을 수행하는 데 필요한 몇 가지 객체가 있습니다. 동시에 여러 스레드에서 사용할 수있는 변수를 잠글 필요가 있다는 것을 알고 있지만 각 스레드가 동일한 객체의 다른 데이터 멤버에 액세스 (쓰는 중)하면 어떻게됩니까? 예를 들어, 각 스레드는 객체의 다른 메소드를 호출하고 호출 된 메소드 중 어느 것도 동일한 데이터 멤버를 수정하지 않습니다. 동일한 데이터 멤버에 액세스하지 않는 한 안전합니까? 아니면 어쨌든 전체 개체를 잠글 필요가 있습니까?C++의 다른 스레드에서 동일한 객체에 속한 다른 데이터 멤버에 액세스

이 주제에 대한 설명과 세부 사항을 살펴 보았지만 모든 예제는 단일 변수 또는 비 멤버 함수에 초점을 맞추는 것처럼 보입니다.

요약 할 내용 : 전체 개체에 잠금을 설정하지 않고 동일한 개체의 서로 다른 두 데이터 멤버에 서로 다른 두 스레드에서 안전하게 액세스 할 수 있습니까?

+0

한 번에 두 스레드에서 동일한 멤버에 액세스하지 못하도록 어떻게 확신 할 수 있습니까? –

+0

구조체 당 잠금 대신 struct 당 변수 잠금을 사용할 수 없습니다. 벌금 나뭇결 잠금 ?? –

답변

4

실제로는 안전하지만 코드를 자주 수행하면 코드 성능이 크게 저하됩니다. 컴퓨터는 "캐시 라인"이라고 불리는 것을 사용합니다. 두 프로세서가 동일한 캐시 라인에서 작업하는 경우 항상 &을 다시 전달해야하므로 작업 속도가 느려집니다.

+0

+1 false 공유의 경우 –

+1

데이터 멤버가 올바르게 정렬되지 않은 경우 안전하지 않을 수도 있습니다. – user396672

2

예, 한 스레드의 다른 구성원에 다른 스레드로 액세스하는 것이 안전합니다.

1

나는 그렇게 할 수 있다고 생각합니다. 하지만 당신은 더 나은 방법 내부가 다른 스레드가 이미 등을 사용하는 다른 방법을 호출하기로 결정하지 않는 동일한 데이터 또는 호출 프로그램에 액세스 할 수 변경하지 않을 것을 확신 할

그래서 가능하지만, 잠재적으로 위험한. 그러나 뮤텍스를 얻으려는 호출을 피하기 때문에 더 빠를 것입니다. 독을 잡아라.

0

동일한 데이터 멤버에 액세스하지 않거나 어쨌든 전체 개체를 잠글 필요가 없다면 안전합니까?

답변은 전적으로 클래스 디자인에 따라 다르지만, 여러 스레드가 동일한 개체에 액세스 할 수있게하기 전에 항상 100 번 생각하는 것이 좋습니다. 사실을 감안할 때 데이터가 인 경우 실제로입니다.은 전체 개체를 잠글 필요가 있습니다.

그럼 다른 질문은 "그들이 같은 클래스에있는 이유는 변수가 참으로 독립적 인 경우?", 발생 실수로 스레딩 킬을 조심하십시오.

0

글쎄, 좋아, 할 수있어.하지만 다른 사람들이 지적했듯이해서는 안된다. IMHO, 데이터 멤버에 대한 액세스는 getter/setter 메서드를 통해 이루어져야합니다. 따라서 필요한 뮤텍스/임계 섹션/세마포링/개체 내에서 캡슐화 된 모든 것이 가능해야합니다.