변수에 대한 액세스를 동기화하려는 Windows 7 드라이버가 있습니다. InterlockedExchange를 사용할 수 있습니까?두 개의 CPU 코어에서 InterlockedExchange
InterlockedExchange에 대한 현재의 이해는 InterlockedExchange가 컴파일러 내장 함수를 통해 수행된다는 것입니다. 즉, 읽기 (InterlockedExchange는 이전 값을 반환 함)를 의미하며 쓰기는 1 클럭 주기로 완료됩니다. 인터 로킹 된 함수는 변수가 항상 인터 로크 된 함수를 통해 액세스되는 경우에만 원자입니다.
그러나이 경우에는 어떻게되는지 :
CPU1: InterlockedExchange(&Adapter->StatusVariable, 5);
CPU2: InterlockedExchange(&Adapter->StatusVariable, 3);
StatusVariable 두 개의 CPU 코어에서 동일한 클럭 사이클에 기록됩니다. 이 함수는 변수가 액세스되었음을 통지하고 다른 클록주기로 쓰기를 지연합니까? 또는 쓰기 후에 변수에 어떤 값이 있는지 정의되지 않았습니까? 변수에 쓰레기가 포함되어있을 수도 있습니까?
편집 : x86 또는 x64를 사용 중입니다.
여기서 언급하지 않은 중요한 점은 해당 호출의 반환 값입니다.연동 호출을 사용하여 반환 값을 검사해야합니다. 내가 틀린 말을하지 않는다면 : StatusVariable의 초기 값이 2라고하면 (정확히 말하면 내가 잘못했다면) 그 호출 중 하나가 2를 반환하고, 다른 하나는 3이나 5를 반환 할 것이고, 값은 각각 5 또는 3이됩니다. 어떤 밟기가 어떤 가치를 얻었는지 알 수 없으며 오히려 이전 값이 무엇인지에 따라 행동해야합니다 - 예상대로였습니까 아니면 중단해야합니까/다시 시도해야합니까? (P.S. 나는 틀릴 수있다.) – AnorZaken