внутренняя реализация std::mutex?
От: barney  
Дата: 16.05.18 18:12
Оценка:
Интересно, как реализованы базовые примитивы мультипоточности в C++? Такие как mutex

насколько я понимаю, все базируется на атомарной test-and-set инструкции (которую я бы назвал fetch-and-set)
и spin_lock блокировке, которая выглядит примерно так:

spin_outer:
cmp flag, 1
je spin_outer // waiting until 0

spin_inner:
test-and-set ax, flag //executed atomicly
// {
// mov ax, flag // fetch current value to ax
// mov flag, 1 // set flag to 1
// }

cmp ax, 1
jne spin_inner // if old value was 0

// now in critical section

call do_work

mov flag, 0 // clean flag
leave:


но это приводит не просто к простою потока, а постоянной нагрузке

при использовании std::mutex для критической секции такого не наблюдается.

как же работает мютекс?
Отредактировано 16.05.2018 18:13 barney . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.