나는 아주 간단한 질문을 가지고있다. 그러나 대답은 나를 벗어나는 것처럼 보인다. 동일한 C++ 클래스의 여러 객체가있는 경우 각 객체는 자체 스레드이므로 동시 액세스 문제를 인식해야합니까? 또는 개별 인스턴스에 대해 자동으로 스레드로부터 안전합니까? 물론 정적 메서드와 인스턴스 메서드가 문제가 될 것이라고 기대합니까?동일한 개체 (C++)의 여러 복사본 : 스레드로부터 안전합니까?
답변
다릅니다. 종종 클래스의 한 인스턴스는 다른 인스턴스의 조작과 독립적입니다. 이것이 단일 스레드에서 발생하는 경우 다중 스레드에서도 마찬가지입니다.
예를 들어 Point를 나타내는 값 유형 클래스를 생각해보십시오.
class Point {
public:
int x, y, z
};
하나 개의 스레드에서이 클래스의 인스턴스는 다른 스레드에서 다른 인스턴스에 대한 작업에 의해 영향을받지 않습니다.
그러나 클래스의 인스턴스는 다른 개체와 상호 작용할 수 있습니다. 두 인스턴스가 같은 객체와 상호 작용할 수 있다면 그렇습니다. 스레드 안전성에 대해 염려해야합니다.
인스턴스 변수는 모두 독립적입니다. 인스턴스 메소드가 인스턴스 변수와 로컬 변수만을 사용한다면 스레드 안전성에 대해 걱정할 필요가 없습니다.
그리고 정적 멤버 변수는 어떻습니까? – mathematician1975
@ mathematician1975 : 이름에서 알 수 있듯이 이들은 독립적이지 않습니다. –
한 개체의 스레드가 다른 개체의 메서드를 호출하지 않는 한 아무 문제가 없어야합니다.
그러나 재귀 메서드가 있고 메서드에서 뮤텍스를 가져 오는 경우에도 여전히 교착 상태가 발생할 수 있습니다. 이 경우 재귀 뮤텍스를 사용해야합니다.
감사합니다. 모두 철저한 대답이었습니다. 그리고 뭔가 새로운 것도 배웠습니다 :) –
각 스레드에 별도의 개체가 있으면 잘됩니다. 클래스에 정적 멤버 변수가 있으면 문제가 발생할 수 있습니다.
분명히 이것은 스레드 함수가 전역 또는 공유 데이터에 액세스하는 경우 문제의 클래스 개체 데이터에만 적용되며 일반적인 다중 스레드 문제가 적용됩니다.
질문의 근원에는 개체가 메모리에 배치되는 방법에 대한 질문이 있습니다. 드문 경우이긴하지만 정적 데이터 멤버가 포함되어 있지 않다고 가정하면 메모리에 배치 된 객체는 객체의 여러 데이터 멤버로만 구성되기 때문에 각 객체는 같은 유형의 다른 객체와 독립적입니다. 예를 들어,
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()
등은 무엇입니까? 대답은 클래스에 대해 각각 한 번만 존재한다는 것입니다. 그리고 메모리가있는 한 데이터와 직접 연관되어 있지 않습니다. 데이터를 함수와 연관시키는 것은 컴파일러 만의 혼자입니다. 스레드는 그것에 대해 신경 쓰지 않습니다.
위의 내용을 고려하여 이것을 생각한다면, 당신을 피한 대답이 당신에게 정착 할 것이라고 의심합니다.
당신은 대략 4 개 부문에서 C++의 항목을 분류 할 수 있습니다 :
이- 읽기 전용 : 리터럴, 상수, 함수, 등 ... 코드의 실행 중에 수정할 수 없습니다, 그래서 본질적이다
- 전역 변수 : 네임 스페이스 범위의 전역, 클래스의 정적 특성, 로컬 정적 함수 등 ... 수정할 수 있으므로 적절한 다중 스레드 인식 메커니즘을 사용해야합니다.
- 스레드 로컬 변수 : 위의 모든 것이지만
thread_local
저장 장치 한정자로 표시됩니다. 다음 지점 - 인스턴스 변수 참조 : 클래스 또는 구조체의 속성, 함수의 지역 변수를 ... 요약하면 한 명시 적
을 공유되지 않은으로 를 사용하는 것이 본질적으로 안전합니다, 당신은 돈 ' 메서드 나 함수에 대해 걱정할 필요가 없으며 상수를 자유롭게 공유 할 수 있습니다.
중간 범위에서 로컬 변수를 공유하지 않도록주의하십시오. 적어도 액세스 할 때 적절한 동기화를 보장하지 않아야합니다.
그리고 마지막으로, 전역을 매우 조심하십시오.
- 1. 여러 ColladaLoader로드가 실패합니다. 스레드로부터 안전합니까?
- 2. Domino의보기가 스레드로부터 안전합니까?
- 3. 스레드로부터 안전합니까?
- 4. 스레드로부터 안전합니까 V4L2 무엇입니까?
- 5. Java MulticastSocket은 스레드로부터 안전합니까?
- 6. Akka에서는 ActorContext가 스레드로부터 안전합니까?
- 7. RegSetValueEx는 스레드로부터 안전합니까?
- 8. 이 메서드는 스레드로부터 안전합니까?
- 9. DocumentBuilder.parse()는 스레드로부터 안전합니까?
- 10. 은 IP2Location 스레드로부터 안전합니까?
- 11. C# 대리자가 스레드로부터 안전합니까?
- 12. 이 메서드는 스레드로부터 안전합니까?
- 13. GWTP 처리기는 스레드로부터 안전합니까?
- 14. EventAggregator, 스레드로부터 안전합니까?
- 15. AutoMapper의 Mapper.Map은 스레드로부터 안전합니까?
- 16. 이 함수는 스레드로부터 안전합니까?
- 17. Win32 레지스트리는 '스레드로부터 안전합니까?'
- 18. .NET 모듈은 스레드로부터 안전합니까?
- 19. 이렇게하면 개체가 스레드로부터 안전합니까?
- 20. 이 함수는 스레드로부터 안전합니까?
- 21. PHP는 스레드로부터 안전합니까?
- 22. 데이터베이스 작업은 스레드로부터 안전합니까?
- 23. 정적 메서드는 스레드로부터 안전합니까?
- 24. Trove 라이브러리는 스레드로부터 안전합니까?
- 25. C# 구조체는 스레드로부터 안전합니까?
- 26. PyTables는 스레드로부터 안전합니까?
- 27. 사전 액세스는 스레드로부터 안전합니까?
- 28. AppKit 스레드로부터 안전합니까?
- 29. Perl의 inet_aton은 스레드로부터 안전합니까?
- 30. Delphi에서 TScreen은 스레드로부터 안전합니까?
모두에게 감사드립니다. 그것은 철저한 대답이었습니다. 그리고 뭔가 새로운 것을 배웠습니다 :) –