2012-06-22 2 views
3

나는 아주 간단한 질문을 가지고있다. 그러나 대답은 나를 벗어나는 것처럼 보인다. 동일한 C++ 클래스의 여러 객체가있는 경우 각 객체는 자체 스레드이므로 동시 액세스 문제를 인식해야합니까? 또는 개별 인스턴스에 대해 자동으로 스레드로부터 안전합니까? 물론 정적 메서드와 인스턴스 메서드가 문제가 될 것이라고 기대합니까?동일한 개체 (C++)의 여러 복사본 : 스레드로부터 안전합니까?

+0

모두에게 감사드립니다. 그것은 철저한 대답이었습니다. 그리고 뭔가 새로운 것을 배웠습니다 :) –

답변

2

다릅니다. 종종 클래스의 한 인스턴스는 다른 인스턴스의 조작과 독립적입니다. 이것이 단일 스레드에서 발생하는 경우 다중 스레드에서도 마찬가지입니다.

예를 들어 Point를 나타내는 값 유형 클래스를 생각해보십시오.

class Point { 
public: 
    int x, y, z 
}; 

하나 개의 스레드에서이 클래스의 인스턴스는 다른 스레드에서 다른 인스턴스에 대한 작업에 의해 영향을받지 않습니다.

그러나 클래스의 인스턴스는 다른 개체와 상호 작용할 수 있습니다. 두 인스턴스가 같은 객체와 상호 작용할 수 있다면 그렇습니다. 스레드 안전성에 대해 염려해야합니다.

1

인스턴스 변수는 모두 독립적입니다. 인스턴스 메소드가 인스턴스 변수와 로컬 변수만을 사용한다면 스레드 안전성에 대해 걱정할 필요가 없습니다.

+0

그리고 정적 멤버 변수는 어떻습니까? – mathematician1975

+0

@ mathematician1975 : 이름에서 알 수 있듯이 이들은 독립적이지 않습니다. –

0

한 개체의 스레드가 다른 개체의 메서드를 호출하지 않는 한 아무 문제가 없어야합니다.

그러나 재귀 메서드가 있고 메서드에서 뮤텍스를 가져 오는 경우에도 여전히 교착 상태가 발생할 수 있습니다. 이 경우 재귀 뮤텍스를 사용해야합니다.

+0

감사합니다. 모두 철저한 대답이었습니다. 그리고 뭔가 새로운 것도 배웠습니다 :) –

2

각 스레드에 별도의 개체가 있으면 잘됩니다. 클래스에 정적 멤버 변수가 있으면 문제가 발생할 수 있습니다.

분명히 이것은 스레드 함수가 전역 또는 공유 데이터에 액세스하는 경우 문제의 클래스 개체 데이터에만 적용되며 일반적인 다중 스레드 문제가 적용됩니다.

0

질문의 근원에는 개체가 메모리에 배치되는 방법에 대한 질문이 있습니다. 드문 경우이긴하지만 정적 데이터 멤버가 포함되어 있지 않다고 가정하면 메모리에 배치 된 객체는 객체의 여러 데이터 멤버로만 구성되기 때문에 각 객체는 같은 유형의 다른 객체와 독립적입니다. 예를 들어,

class Location { 
    private: 
    double latitude1; 
    double longitude1; 
    public: 
    double latitude() const { return latitude1; } 
    double longitude() const { return longitude1; } 
    Location(const double lat0, const double long0) { 
     latitude1 = lat0; 
     longitude1 = lon0; 
    } 
    // Calculate the Location at exactly the furthest 
    // point on earth (implemented elsewhere). 
    Location antipode(); 
}; 

이 유형의 별도의 객체가 다른 곳 (에서 그런

Location my_loc(-100.0, 35.0); 
const Location your_loc(15.0, 45.5); 

, my_loc 자체 메모리에서 두 배의 쌍 아무것도하지만 구성으로 인스턴스화한다고 가정 유형 정의를 가정 이 경우, 스택상의 한 쌍의 연속적인 복식); your_loc 그 자체는 별도의 두 쌍의 복식으로 구성됩니다. 따라서 데이터가 이동하는 한 Location은 두 개의 double 구조체에 지나지 않습니다.

하지만 질문 : constructor는 무엇이며 antipode() 등은 무엇입니까? 대답은 클래스에 대해 각각 한 번만 존재한다는 것입니다. 그리고 메모리가있는 한 데이터와 직접 연관되어 있지 않습니다. 데이터를 함수와 연관시키는 것은 컴파일러 만의 혼자입니다. 스레드는 그것에 대해 신경 쓰지 않습니다.

위의 내용을 고려하여 이것을 생각한다면, 당신을 피한 대답이 당신에게 정착 할 것이라고 의심합니다.

0

당신은 대략 4 개 부문에서 C++의 항목을 분류 할 수 있습니다 :

  • 읽기 전용 : 리터럴, 상수, 함수, 등 ... 코드의 실행 중에 수정할 수 없습니다, 그래서 본질적이다
  • 전역 변수 : 네임 스페이스 범위의 전역, 클래스의 정적 특성, 로컬 정적 함수 등 ... 수정할 수 있으므로 적절한 다중 스레드 인식 메커니즘을 사용해야합니다.
  • 스레드 로컬 변수 : 위의 모든 것이지만 thread_local 저장 장치 한정자로 표시됩니다. 다음 지점
  • 인스턴스 변수 참조 : 클래스 또는 구조체의 속성, 함수의 지역 변수를 ... 요약하면 한 명시 적

을 공유되지 않은으로 를 사용하는 것이 본질적으로 안전합니다, 당신은 돈 ' 메서드 나 함수에 대해 걱정할 필요가 없으며 상수를 자유롭게 공유 할 수 있습니다.

중간 범위에서 로컬 변수를 공유하지 않도록주의하십시오. 적어도 액세스 할 때 적절한 동기화를 보장하지 않아야합니다.

그리고 마지막으로, 전역을 매우 조심하십시오.

관련 문제