Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет yigal_s ([info]yigal_s)
@ 2004-05-22 22:04:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Программирование: расширение стандартных синхронизационных примитивов
Там-сям, почитывая форум по мультитредному программированию, собрал некоторые идеи по расширению функциональности стандартных синхронизационных примитивов. Большинство, кажется, принадлежат Alexander Terekhov-у. Воспроизвожу я всё по памяти и могу что-то где-то и напутать.

Для семафора или мютекса имеет смысл введение операции

bool Semaphore::TryToRelease();

которая освобождает семафор в том и только в том случае, когда его кто-то ждет. Возращаемое значение, естественно, помогает выяснить, был освобожден семафор или нет.

Другая идея для mutex-a - локирующая операция может сообщать, был ли захвачен данный мютекс с момента последнего Release-a этим же тредом.

Наконец, чудесная операция для ReadWrite Lock-a

bool SwitchFromReadToWrite();

делающая "невозможное" - переключающая Read Lock на Write Lock. Имплементация пытается сделать атомарное переключение с Read на Write. Если же подобное переключение чревато дедлоком (скажем, когда другой тред уже ожидает возможности подобного переключения), то та же операция выполняется неатомарно, с помощью тривиального выхода из ReadLock-a и последующего взятия WriteLock-a. Возращаемое значение позволяет судить, по какому из двух возможных путей пошло переключение.
Image