Это потому, что мьютекс должен быть установлен с использованием атомарных команд LOAD и STORE, чтобы доступ к памяти не переупорядочивался? Атомное выполнение набора инструкций означает, что
инструкции обрабатываются как один шаг, который нельзя прервать.
// example process using mutual exclusion
void process() {
int mutex;
init_lock (&mutex);
do {
lock (&mutex);
// critical section
unlock (&mutex);
//remainder section
} while(TRUE);
}
// mutual exclusion functions
void init_lock (int *mutex) {
*mutex = 0;
}
void lock (int *mutex) {
while(TestAndSet(mutex))
}
void unlock (int *mutex) {
*mutex = 0;
}
int TestAndSet(*target) {
int rv = *target;
*target = 1;
return rv;
}
Просто глядя на это, кажется, что функции делают то же самое, что и пример кода, опубликованный ранее, но я предполагаю, что этот способ обеспечивает взаимное исключение, потому что функции, работающие с * target, являются атомарными ...
Извините за любые опечатки ...