2011-02-04 3 views
2

NT 기반 Windows OS에서 특정 스레드를 강제로 (즉, 적어도 사용자 코드를 중단하면서) 특정 스레드를 강제로 호출하도록하는 APC 변형 또는 다른 기술이 있습니까? 경계 가능한 대기를 입력 하시겠습니까?경고 대기를 기다리지 않고 대상 스레드를 인터럽트하는 APC 변형이 있습니까?

이 모든 종류의 동시성 문제가 발생할 수 있음을 알고 있습니다. 내가 그것을 사용하고자하는 주된 목표는 다른 스레드 (그리고 완료를 기다리는 중)에서 프로세서 레벨 메모리 장벽을 강제하는 것입니다.이 방법을 얻는 다른 방법이 도움이 될 수 있습니다. 그러나 이것이 가능하면 여전히 궁금합니다.)

답변

2

당신은 할 수는 있지만 예쁘지 않습니다. 스레드가 이것을 기대하지 않으므로 호출 할 수있는 범위가 매우 제한됩니다. 예를 들어, 동기화 API를 사용하는 항목을 호출 할 수 없습니다.

여전히 수행하려는 경우 - SuspendThread, GetThreadContext, SetThreadContextResumeThread을 사용하면 함수 호출을 시뮬레이트 할 수 있습니다. 플래그를 포함하여 모든 레지스터를 보존해야합니다.

분명히 플랫폼 별 코드가 필요합니다. 또한 일부 사용자 모드 코드는 스택 포인터 위에있는 위치를 터치하므로 밀어 넣은 반송 주소에 약간의 여백을 추가 할 수 있습니다.

+0

재미있는 접근 방식, 조금 두렵다면. 그런 맥락에서'ReleaseSemaphore'를 호출하는 것이 안전한가요? 내가 한 트리거링 쓰레드와 통신 할 수 있어야합니다. 이상적으로 커널이 한 번의 호출로 모든 것을 처리하도록하고 싶습니다. - Suspend -> Resume은 두 개 이상의 IPI가 필요할 수 있습니다 ... – bdonlan

+0

예,이 컨텍스트에서 ReleaseSemaphore를 호출 할 수 있습니다. 이는 거의 직접 syscall로 변환되기 때문입니다. 나는 RCU를 구현하는 더 좋은 방법을 생각할 수있다. 예를 들어, 쓰레드 당 데이터 구조 ('TlsGetVAlue')가 있습니다. – John

1

아니요, 일반적으로 다른 스레드가 보유한 가정을 위반하기 때문입니다. 다른 스레드는 프로세스 작동 세트를 변경하는 사용자 모드 코드가 아닌 커널에 의해 인터럽트 될 수 있다고 가정해야합니다.

+0

본인은 일반적으로 위험 할 수 있음을 이해합니다. 사용자 공간 RCU를 구현하기 위해 이것을 사용하고 싶습니다. 특정 RCU 프로토콜에는 다른 스레드에서 프로세서 메모리 장벽을 트리거하는 방법이 필요합니다. 말 그대로 모든 인터럽트 기능은 메모리 배리어 프리미티브를 호출 한 다음 세마포어를 인식하여 주 손상이 문제가 될 것이라고 기대하지 않습니다. – bdonlan

관련 문제