в одном потоке? скажем есть алгоритм, который выполняется, то на одном потоке, то на другом и нужно сделать захват на время выполнения алгоритма
Семафор?
а они есть в стд?
https://en.cppreference.com/w/cpp/thread/condition_variable не подойдет?
Хз, а как им в подобном ключе воспользоваться можно?
тем что, подписываешься на потоки и ждешь, когда все отработают
кондвары с мутексами равномощны семафорам вполне и в теории можно реализовать одно через другое
Один ждёт многих, или многие ждут одного?
может не захват, а wait?
Нет не wait именно захват а одном потоке и освобождение в другом, считай что это в корутине и в какой-то точке она переехала на другой поток не отпуская лок
ну блин пусть ставит флажок атомарный "занято"
вы хотите странного. C++ ные примитивы синхронизации под капотом работают с тем, что предоставляет OS. для OS владельцем mutex является конкретный тред
Вы не очень прав 1) ос не всегда предоставляет примитивы синхронизации, а те что есть не всегда стоит использовать 2) mutex, у которого можно звать unlock не в lock треде, можно реализовать как semaphore с release(1) в unlock и ctor, acquire(1) в lock 3) такой мьютекс бывает полезен, я бы не сказал что это странно, простейший пример fork, сложнее например некий асинхронный код исполнение которого вместе с захваченным для каких то данных ресурсов мьютексом может перемещаться между потоками
1) стоит ли пользоваться такими OC в которых нет mutex? 2) это будет не mutex, а что-то другое. Реализовать можно, да. 3) полезно? где-то да. Но см. выше, это не mutex.
Ну если locked заменить на счётчик то это семафор и есть.
В общем вариант для тех у кого кроме мьютексов ничего нету, но интересный вариант
1) например в линуксе нет, я только в винде знаю системные мьютексы
Чем futex не mutex?
Ну не мьютекс
Fast userspace mutex Да ладно
Ой ну не надо тут давайте Wait/WakeOnAddress тоже мьютексом называть
Он назван плохо, futex — это про всю реализацию мьюеткса вместе с юзерспейсным атомиком Странно сисколл называть юзерспейсным
Тут уже давно придирки к словам пошли, так что я продолжу :) Wait/WakeOnAddress() хранят хэш-таблицу в юзерспейсе - внутри ntdll. Причем, судя по беглому взгляду, (почти) lock-free
а зачем post(1) в конструкторе?
Ну потому что если в семафоре будет 0 после конструктора, то мьютекс у нас не получится так как захватить его будет нельзя
Обсуждают сегодня