Цитата:
согласно описанию, xchg является единственной инструкцией (ещё со времён 8086), которая сама выставляет соответствующий сигнал независимо от наличия префикса.
Я знаю только со времён 486 в 286 и 386 такого не было.
Я много читал как это работает и понял одно. Толи у интела ошибки по тексту толи они сами не понимают где работает, а где нет.
Цитата:
С критическими секциями, как по мне, идея неудачная. Существенно усложняется реализация и т.п., а каков выигрыш?
Сахар чисто синтаксический. Понятно что достаточно сделать глобальную переменную. Но я не ищу легких путей.
Всегда найдётся пользователь который справку не прочтёт и будет делать в локальной памяти. Так что это ещё защита "от дурака".
В Си в OpenMP это всё решается текстовым препроцессором. Но это оставлю на будущее.
Цитата:
Кстати, о реализации. Соответствующий код уже может быть выбран процессором и находиться на декодировании, и его модификация в этой ситуации не приведёт к отмене уже выполненной выборки. Соответственно, существует ненулевая вероятность, что старый код будет выполнен формально уже после того, как он заменён на новый -- следовательно, надо останавливать потоки и т.п.
Да вы правы. Поэтому добавлен следующий код.
Код:
SpinMutexDoLock(CriticlSectionsList.Lock);
// Не успели пропатчить, а ядра уже скопились в выше стоящем мьюткса
// Проверяем зарегистрирована ли критическая секция или ещё нет.
if SeachAddr(CriticlSection, Addr) then
begin
Exit; // Переход в предыдущую функцию где идёт обработка критической секции
end else
// Регистрируем критическую секцию и патчим код.