Информация об изменениях

Сообщение внутренняя реализация 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 блокировке, которая выглядит примерно так:

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 блокировке, которая выглядит примерно так:

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 для критической секции такого не наблюдается.

как же работает мютекс?