Сообщение внутренняя реализация std::mutex? от 16.05.2018 18:12
Изменено 16.05.2018 18:13 barney
внутренняя реализация std::mutex?
Интересно, как реализованы базовые примитивы мультипоточности в C++? Такие как mutex
насколько я понимаю, все базируется на атомарной test-and-set инструкции (которую я бы назвал fetch-and-set)
и spin_lock блокировке, которая выглядит примерно так:
но это приводит не просто к простою потока, а постоянной нагрузке
при использовании std::mutex для критической секции такого не наблюдается.
как же работает мютекс?
насколько я понимаю, все базируется на атомарной test-and-set инструкции (которую я бы назвал fetch-and-set)
и spin_lock блокировке, которая выглядит примерно так:
spin:
cmp flag, 1
je spin // waiting until 0
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 // if old value was 0
// now in critical section
call do_work
mov flag, 0 // clean flag
leave:
но это приводит не просто к простою потока, а постоянной нагрузке
при использовании std::mutex для критической секции такого не наблюдается.
как же работает мютекс?
внутренняя реализация std::mutex?
Интересно, как реализованы базовые примитивы мультипоточности в C++? Такие как mutex
насколько я понимаю, все базируется на атомарной test-and-set инструкции (которую я бы назвал fetch-and-set)
и spin_lock блокировке, которая выглядит примерно так:
но это приводит не просто к простою потока, а постоянной нагрузке
при использовании std::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 для критической секции такого не наблюдается.
как же работает мютекс?