| |||
![]()
|
![]() ![]() |
![]()
Программирование: расширение стандартных синхронизационных примитивов Там-сям, почитывая форум по мультитредному программированию, собрал некоторые идеи по расширению функциональности стандартных синхронизационных примитивов. Большинство, кажется, принадлежат Alexander Terekhov-у. Воспроизвожу я всё по памяти и могу что-то где-то и напутать. Для семафора или мютекса имеет смысл введение операции bool Semaphore::TryToRelease(); которая освобождает семафор в том и только в том случае, когда его кто-то ждет. Возращаемое значение, естественно, помогает выяснить, был освобожден семафор или нет. Другая идея для mutex-a - локирующая операция может сообщать, был ли захвачен данный мютекс с момента последнего Release-a этим же тредом. Наконец, чудесная операция для ReadWrite Lock-a bool SwitchFromReadToWrite(); делающая "невозможное" - переключающая Read Lock на Write Lock. Имплементация пытается сделать атомарное переключение с Read на Write. Если же подобное переключение чревато дедлоком (скажем, когда другой тред уже ожидает возможности подобного переключения), то та же операция выполняется неатомарно, с помощью тривиального выхода из ReadLock-a и последующего взятия WriteLock-a. Возращаемое значение позволяет судить, по какому из двух возможных путей пошло переключение. ![]() |
||||||||||||||
![]() |
![]() |