InterlockedIncrement는 어떻게 작동합니까?InterlockedIncrement vs. ++
멀티 프로세서 시스템에만 관련된 사항입니까?
모든 프로세서에서 인터럽트를 비활성화 하시겠습니까?
InterlockedIncrement는 어떻게 작동합니까?InterlockedIncrement vs. ++
멀티 프로세서 시스템에만 관련된 사항입니까?
모든 프로세서에서 인터럽트를 비활성화 하시겠습니까?
jcopenha는 정확하지만 "멀티 프로세서 시스템에만 관심이 있습니까?"라고 대답하고 싶습니다.
어떤 Interlocked
을 사용하고 있는지 잘 모릅니다. 만약 당신이 C++을 의미한다면, 싱글 코어에서 x가 당신의 "비트"보다 크지 않다면 "++ x"를하는 것이 안전해야합니다. 컴파일러가 함수에서 이상한 방법으로이를 최적화 할 수 있기 때문에 필자는 "should be"라고 씁니다. 예를 들어 두 개의 "++ x"를 완전히 다른 곳에서의 일반적인 "add ..., 2"로 변경하고 멀티 스레딩 중 일부는 그로 인해 논리가 실패 할 수 있습니다. 멀티 코어에서 32 비트 x의 ++ x조차도 이상한 영향을 미칠 수 있습니다. 명령은 "inc mem"또는 "lock inc mem"일 수 있으며 잠겨 있지 않은 한 두 개의 CPU에서 하나의 mem 주소를 증가 시키면 이상한 결과를 얻는다).
x의 "bitness"가 CPU보다 높으면 멀티 스레드 코드에서 인터록이 필요합니다. 싱글 또는 멀티 코어 인 경우 상관 없습니다. 어쨌든 두 개의 asm 코드로 컴파일해야하기 때문에 컨텍스트 스위치가 중간에 발생할 수 있습니다. (이것은 RCU로 고정 될 수 있습니다)
.NET에서는 기본적으로 같은 이야기지만 Interlocked ...와 Interlocked ... 64 대신 Increment를 오버로드했습니다.
그렇습니다. (단일 코어에서도) 멀티 스레드 된 내용을 작성할 때마다 공유 메모리에 인터 로킹 된 증분 만 사용하십시오. 여기의 기계보다 "더 똑똑하다"는 것은 가치가 없습니다.
멀티 코어 시스템에서 실행되는지 모를 정도로 해안에 "해야 할 일"이 있습니다. 또한 x ++는 x 위치에 따라 다른 기계어 코드와 cpu의 기능을 해결합니다. 레지스터를 증가시키는 경우를 생각하고 있었지만 컴파일러가 할 수있는 한 가지 가능한 방법 일뿐입니다. mem, increment, mem을 쓰면 끝날 수 있습니다. 확실히 원자가되지 않습니다. 이것을 다시 임베디드 8 비트 AVR 및 ARM 세계로 번역하려고 시도합니다. – JeffV
InterlockedIncrement는 컴퓨터 수준의 명령어를 사용하여 값을 원자 단위로 증가시키고 저장합니다. 즉, 프로세스 중에 값과 저장 위치에 대해 아무 작업도 수행 할 수 없습니다.
여러 스레드 또는 프로세스가 있거나 동일한 값에 액세스 할 때마다 문제가 될 수 있습니다. 따라서 다중 스레드 응용 프로그램의 공유 변수이거나 여러 프로세스의 공유 메모리입니다.
적어도 명령은 x86 유형 하드웨어에서 인터럽트를 비활성화한다고 생각하지 않습니다.
반대로, 응용 프로그램이 멀티 스레드 인 한 실행중인 시스템은 문제가되지 않으므로 걱정할 필요가 없습니다. 반대의 경우는 사실이 아닙니다. 멀티 프로세서 시스템에서 실행되는 단일 스레드 응용 프로그램에서는 걱정할 필요가 없습니다. –
은 멀티 프로세스 컨텍스트에서 멀티 스레드 및 공유 메모리에 대해 약간 언급했습니다. – jcopenha
나는 멀티 프로세서 시스템 (여러개의 분리 된 프로세서들)을 언급했다. AFAIK InterlockedIncrement()는이 경우에도 작동하지만 잠긴 명령어가 프로세서 중 하나에서만 실행되기 때문에 실현 방법을 모르겠습니다. – mg30rg
.NET이나 다른 언어/플랫폼에 대해 이야기하고 있습니까? –
@MatthewScharley 그는 그렇지 않다고 생각합니다. 그는 InterlockedIncrement가 아니라 Interlocked 클래스 (Interlocked * 함수를 관리하는 래퍼)를 언급했을 것입니다. – mg30rg