У меня есть функции lock (), unlock (), query1 (), query2 () и query3 (). Функции запросов просто выполняют какой-либо запрос к базе данных и могут рассматриваться как доступ к ней. Они не блокируются. Моя система многопоточная.
Мне нужна следующая функция: если lock () вызывается из потока p1, будут выполняться только запросы из потока p1, а запросы из всех других потоков ожидают разблокировки. Как мне это сделать?
Я использую pthreads из C. Для этого поток должен знать, что он удерживает блокировку. Но у pthreads такой функции нет.
Это неправильный дизайн ??
EDIT:
Function1(){
lock();
query1();
query2();
doQuery3();
unlock();
}
doQuery3(){
lock();
query3();
unlock();
}
Я хочу использовать функцию lock (), если поток уже удерживает эту блокировку, он не должен ждать блокировки. Это должно просто бежать. Дело в том, что моя функция lock () фактически запускает транзакцию. Я хочу запустить кучу вещей в сделке. И unlock () завершает транзакцию. Я хочу иметь возможность цепочки запросов. Одним из обходных путей является вызов метода query3 () в Function1 () вместо doQuery3 (); Это означало бы, что для каждой функции есть две версии, одна с блокировкой и одна ванильный запрос ()
Опять же, эти функции блокировки и разблокировки могут быть или не быть мьютекс-блокировками. Я пытался реализовать его с помощью pthread mutex, но не смог. Потому что pthread_mutex_lock в одном и том же потоке блокирует! Какие-нибудь крутые трюки ??