Има ли C++ еквивалент на java.util.concurrent.locks.ReentrantReadWriteLock?

Бих искал да контролирам достъпа до гетери и сетери за куп класове данни, за да ги направя безопасно достъпни от множество нишки едновременно. Правил съм това в Java преди с java.util.concurrent.locks.ReentrantReadWriteLock и беше доста безболезнено.

Но сега имам много проблеми в текущия си C++ проект, защото не мога да намеря имплементация за повторно влизане при четене/заключване. По-конкретно, искам такава, която позволява на нишката да получи заключването за четене, ако вече има заключването за запис, без блокиране и без първо да се откаже от заключването за запис.

Причината е проста: някои от моите методи за настройка извикват методи за получаване и първите (обикновено) получават ключалки за запис, а вторите ключалки за четене. Не искам да изопачавам простата си getter/setter архитектура само за да заобиколя ограниченията в заключващите класове.

Опитах Qt (4.8) QReadWriteLock и свързани класове, както и unique_lock и shared_lock на Boost. Нито една библиотека не прилага необходимото повторно влизане. Някоя друга част от Boost адресира ли това?

Или има друга библиотека, която има това? Наистина съм изненадан, че нито Qt, нито Boost изглеждат, тъй като изглеждат толкова очевидно желана функция. (И който е част от стандартната библиотека на Java от 2004 г.)


person Chris    schedule 26.06.2013    source източник
comment
Не е ли конфигурируема опция като опция за рекурсивно заключване? Изглежда, че може да се наложи да се освежа!   -  person Huy    schedule 26.06.2013
comment
@Huytard: Благодаря за бързия отговор. Това ви позволява да получите един и същи вид заключване повече от веднъж в една и съща нишка. Полезно, но не стига достатъчно за моите нужди.   -  person Chris    schedule 26.06.2013
comment
хех, преди много години се опитах да убедя поддържащите библиотеката за усилващо заключване да направят ключалките повторно влизащи, но те бяха фундаментално против концепцията за повторно влизане. Имам чувството, че поддържахме собствена вилица, която имаше поддръжка за повторно влизане, което беше доста тривиално.   -  person jtahlborn    schedule 26.06.2013
comment
Не, има прост recursive_mutex и има нерекурсивен shared_mutex (за брави за четене/запис). Няма shared_recursive_mutex.   -  person Igor R.    schedule 26.06.2013
comment
@jtahlborn Любопитен съм, какво разбрахте като обосновка за пропускането на такава функция?   -  person Huy    schedule 26.06.2013
comment
@Huytard - поддържащите мислеха, че повторното влизане е фундаментално лош софтуерен дизайн. те основно очакваха контролерът за заключване да има входна точка от най-високо ниво, която контролира ключалката и всички вътрешни повиквания ще работят с/в контекста на ключалката. няма значение, че това работи само в опростени софтуерни сценарии.   -  person jtahlborn    schedule 26.06.2013
comment
@Huytard - интернет никога не забравя: lists.boost.org/Archives/ boost/2004/09/72200.php   -  person jtahlborn    schedule 26.06.2013
comment
@jtahlborn благодаря ви мили сър!   -  person Huy    schedule 26.06.2013


Отговори (1)


Като човек, който се е занимавал с многопоточност с C++, не съм сигурен, че ще намерите тази функционалност в широко разпространена библиотека. Доколкото знам, усилващите нишки, std нишките и POSIX нишките не позволяват това.

В резултат на това, за да разрешите проблема си, бих предложил следното:

  1. Погледнете отново схемата си за заключване и данните, които споделяте. Има ли друг начин, по който можете да постигнете това, което сте си поставили за цел?

  2. Опитайте се да внедрите своя собствена версия на заключващите примитиви, които търсите. Трябва да е просто сравнително просто разширение на примативите, които вече са налични в каквато и библиотека да изберете. Освен това го споделете с общността, тъй като съм сигурен, че няма да сте единственият с този проблем.

person It'sPete    schedule 27.06.2013