Существует ли вариант APC, который прерывает целевой поток, не ожидая ожидаемого ожидания? - PullRequest
2 голосов
/ 04 февраля 2011

Существует ли вариант APC или какой-либо другой метод в ОС Windows на базе NT, который заставит определенный поток немедленно вызывать определенную пользовательскую функцию (или, по крайней мере, прерывать пользовательский код), не ожидая потокавойти в оповещаемое ожидание?

Я понимаю, что это может привести ко всем видам проблем параллелизма.Основная цель, для которой я хотел бы использовать это, состоит в том, чтобы форсировать барьер памяти уровня процессора из другого потока (и ждать завершения) - другие методы для достижения этого были бы полезны, но мне все еще интересно, возможно ли это вообще:)

Ответы [ 2 ]

2 голосов
/ 11 февраля 2011

Вы можете сделать это, но это не красиво. Так как поток не ожидает этого, вы будете очень ограничены в том, что вы можете назвать. Например, вы не сможете вызывать что-либо, использующее какой-либо API синхронизации.

Если вы все еще хотите это сделать - SuspendThread, GetThreadContext, SetThreadContext и ResumeThread позволят вам симулировать вызов функции. Вам нужно сохранить все регистры, включая флаги.

Очевидно, что для этого требуется специфичный для платформы код. Также обратите внимание, что некоторый код пользовательского режима касается местоположений, которые находятся выше указателя стека, так что вы можете захотеть добавить некоторое поле к возвращаемому адресу возврата.

1 голос
/ 04 февраля 2011

Нет, потому что это, как правило, нарушает предположения другой ветки. Другой поток должен предполагать, что это может быть прервано ядром, но не код пользовательского режима, изменяющий рабочий набор процесса.

...