2011-01-07 1 views
9

내가 원자라고 할 때, 나는 명령 세트가 컨텍스트 스위칭없이 실행될 것이라는 것을 의미했다. 동일한 프로세스상의 다른 스레드에 (물론 다른 종류의 스위치도 수행되어야한다). 내가 떠올랐다 유일한 해결책은 현재 실행중인 부분을 제외한 모든 스레드를 일시 중지하고 이후에 다시 시작하는 것입니다. 더 우아한 방법?코드 조각을 원자 단위로 만들 수 있습니까 (C#)?

내가하고 싶은 이유는 여러 스레드에서 실행되는 객체의 일관된 상태를 수집하기 위해서입니다. 그러나, 그들의 코드는 변경할 수 없습니다 (이미 컴파일되어 있습니다). 그래서 뮤텍스, 세마포어 등을 삽입 할 수 없습니다. 원자 적 연산은 물론 상태 수집 (즉, 일부 변수 복사)입니다.

+1

달성하려는 목표는 무엇입니까? 다른 모든 스레드를 일시 중단하는 것은 위험한 방법이며, 깨어있는 스레드가 무언가를 시도하고 일시 중단 된 스레드 중 하나가 잠금 해제 된 상태에서 교착 상태가 발생할 수 있습니다. –

+0

나는 이런 맥락에서 원자라는 단어를 들어 본 적이 없다. 나는 거래의 정의 인 ACID의 일부로 만 알고 있습니다. 그건 그렇고, 왜 이것을 필요로합니까? –

+0

개별 IL 작업은 원 자성입니다. 원 자성 조작을 지원하는 클래스는 거의 없습니다 (하나는 인터 로킹 됨). 그 외에는 아니야. 그리고 나는 그 요점을 보지 못한다. – Amy

답변

4

Interlocked 클래스에는 몇 가지 원자 연산이 있지만 몇 가지 매우 간단한 연산 만 제공합니다. 전체 코드 블록을 작성하는 데 사용할 수 없습니다.

문맥이 변경 되어도 코드가 계속 작동하는지주의 깊게 잠그는 것이 좋습니다.

1

음, locks을 사용할 수 있지만 컨텍스트 전환을 정확하게 방지 할 수는 없습니다. 그러나 당신의 쓰레드가 같은 객체에 락을 걸면, 분명히 기다리고있는 쓰레드는 실행되지 않을 것이므로 아무것도 실행할 필요가 없기 때문에 컨텍스트 스위칭이 필요 없습니다.

this page도 볼 수 있습니다.

+0

잠금이 반드시 "동일한 프로세스의 다른 스레드로 컨텍스트 전환하지 않고" –

+0

그래, 나중에 그 사실을 깨달았습니다. 약간의 변화를 만들었지 만 여전히 질문에 잘 대답하지 않는다고 생각합니다. – Mehrdad

-1

아니요. 코드 블록을 모니터로 묶어서 스레드로부터 안전하게 만들 수 있지만 일반 코드 스 니펫을 원자 적으로 만들 수는 없습니다.

object lck = new object(); 

lock(lck) 
{ 
    // thread safe code goes in here 

} 
+0

왜 이것은 다운 그레이드됩니까? 내 대답이 어떻게 든 잘못 되었나요? – Amy

+0

@ yodaj007 : 그것은 내가 downvoted하지만 나는 추측을 가지고 : 귀하의 코드 (맹목적으로 복사 및 붙여 넣기 경우) 실행될 때마다 새로운 개체를 생성하므로 실제로 아무것도 동기화되지 않습니다. –

+0

어. 네, 입력 한대로 사실입니다. 그것은 맹목적으로 복사/붙여 넣기되지 않았습니다. 나는 메모장에서 그것을 타이프했다. ++. – Amy

0

아니요, 멀티 태스킹이 아닙니다.

귀하의 질문과 관련없는 ... 증분과 같은 매우 간단한 작업이 아니라면.

+1

Interlocked 클래스에 대해 언급하지 않는 한 숫자를 증가 시키면 아무런 반응이 없습니다. 원하는 경우이를 증명할 수있는 코드를 제공 할 수 있습니다. 그래서에 대한 질문을하고 대답 해 드리겠습니다. – Amy

+0

나는 일반적으로 말했고, 그 간단한 조작은'Interlocked.Increament()'와 비슷합니다. – Xaqron

0

원자 1 리더/멀티 라이터 레지스터의 콜렉션 (배열)으로 구성된 공유 메모리에서 전역 상태를 얻을 수 있습니다. 해결책은 간단하지만 사소한 것은 아닙니다. 당신은 "공유 메모리의 원자 스냅 샷"이라는 종이에 실린 알고리즘을 읽을 수 있습니다. 또는 멀티 프로세서 프로그래밍 서적에서 4 장을 읽을 수 있습니다. 자바 언어 구현에 대한 아이디어를 얻을 수 있습니다. 당신이 다른 언어로 그것을 옮길 수 있어야한다는 아이디어에 익숙하다. 미안해, 내 영어가 충분하지 않다면.

관련 문제