2013-10-15 5 views
1

여기에 가설이 있지만 확인하기가 다소 힘듭니다.cpp 객체 메소드에는 자체 스택 프레임이 있습니까?

두 스레드가 동일한 객체 인스턴스의 동일한 메소드를 호출 할 때 각 호출 스레드마다 고유 한 스택 프레임이 있습니까? 컴파일 된 바이너리에서 클래스를 메모리의 함수 정의로 채워진 정적 코드 섹션으로 이해하고 다른 객체 간의 유일한 차이점은 후드 아래로 전달되는 this 포인터입니다.

그러나 스레드를 호출하는 스레드는 자체 스택 프레임을 가져야합니다. 그렇지 않으면 같은 개체 인스턴스의 동일한 멤버 함수에 액세스하려고하는 두 스레드가 서로의 로컬 변수를 손상시킵니다.

여기 다시 말씀 드리지만, 두 스레드가 동시에 this을 수정하여 개체 데이터를 손상시킬 수 있는지 여부를 언급하지는 않습니다. 그 사실을 잘 알고 있습니다. 두 스레드가 동일한 인스턴스의 동일한 메소드를 동시에 입력하는 경우, 해당 컨텍스트의 로컬 변수가 메모리의 동일한 위치인지 여부와 관계없이 더 많은 것을 얻고 있습니다. 다시, 제 가정은 그들이하지 않는다는 것입니다.

+0

"스레드 안전 컴퓨팅"의 핵심을 만지고 있습니다. – Floris

답변

1

정확합니다. 각 스레드는 자체 스택을 사용하며 각 스택은 로컬 변수를 스레드간에 구분합니다.

이것은 C++과 관련이 없습니다. 그것은 프로세서가 작동하는 방식 일뿐입니다. (현대 프로세서에서 일부 오래된 프로세서는 스택이 256 바이트 뿐이고 스레드를 실행할 수있는 실제 능력이없는 6502와 같은 하나의 스택을가집니다 ...)

개체가 스택에 있고 스레드간에 공유 될 수 있습니다 따라서 다른 스레드 스택에서 같은 객체를 수정하게 될 수 있습니다. 하지만 그 특정 포인터를 공유하는 경우에만 해당됩니다.

+0

답변 해 주셔서 감사합니다. 나는 그것이 의미가 있다는 것을 알았지 만, 나의 회의론은 즉각적인 검증을 요구하는 것으로 보인다. 감사 :) –

0

당신은 다른 스레드가 고유 한 스택을 가지고 있다는 말이 맞습니다. 이것은 C++이나 cpp의 기능이 아니라 OS가 제공하는 기능입니다. 클래스 객체는 반드시 다를 필요는 없습니다. 이는 할당 방법에 따라 다릅니다. 서로 다른 스레드가 힙 오브젝트를 공유하여 동시 발생 문제를 일으킬 수 있습니다.

0

함수 또는 클래스 메서드의 로컬 변수는 각 스택에 저장되므로 실제로 스레드의 스택에서 스택 프레임에 배치되므로 메소드를 호출하는 스레드에 관계없이 중요합니다. 각 메서드 호출이 생성 자신의 스택 (또는 더 나은 스택 프레임)

참고 : 각 호출

조금 다른 설명은 실행 중에 스택 정적 변수가 기술이 존재 물론 같은

될 것입니다 실행 중에 다른 메소드의 스택 메모리에 액세스 할 수 있지만 해킹이 있습니다.

+0

아니요. 각 메서드 호출은 호출 스레드가 소유 한 스택에 * 자체 스택 프레임 *을 만듭니다. – EJP

+0

@EJP가 동의합니다. 스택 아래에 "스택의 위치"를 의미합니다. –