Состояние гонки невозможно с 1 ядром в C?

#linux #cpu #c #locking #multithreading

Вопрос:

Я добавил следующее в ядро Linux:

 volatile int global_lock;
wait_queue_head_t global_queue;


int sys_global_lock() {
    while (global_lock != 0)
    {
        // Automatically puts the process to sleep if global_lock is locked;
        wait_event_interruptible(global_queue, amp;global_lock);
    }
    global_lock = 1;
}
 

Примечание: Известно, что публичная блокировка предназначена для системных вызовов, а не для обработчиков прерываний исключений.

 int sys_global_unlock() {
    global_lock = 0;
    wake_up_interruptible(global_lock); // wake up all processes waiting in ...
    // ... global_queue
}
 

и попытался запустить с 2 потоками:

 global_lock(); // Wrapper function for sys_global_lock
x  ;
global_unlock(); // Wrapper function for sys_global_unlock
 

Я увеличил количество процессов в своей виртуальной машине до 4 и увидел, что x продвинулся на 1 только в некоторых случаях, я понимаю, что произошло, и вот мое объяснение:

поток 1 вводит sys_global_code и ждет, прежде чем обновить блокировку до 1, затем поток 2 переходит на x и ждет, затем они оба почти вместе продвигаются к запуску x , и здесь у нас есть состояние гонки.

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

Комментарии:

1. ясен ли мой вопрос?