#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. ясен ли мой вопрос?