Привет Fellow буста Энтузиастоввопросы подталкивание :: shared_mutex в 1.50
Мы столкнулись с проблемой, с shared_mutex и копал в источник наддува. Мы не можем сказать, является ли это случаем блокировки, или мы просто не понимаем общую реализацию mutex для блокировки чтения/записи.
Применение:
У нас есть карта map< Ptr*, data>
, которая должна быть создана и запрашиваются несколькими потоками. Тем не менее, Большинство значений Ptr*
являются общими, поэтому происходит быстрая разминка, а затем то, что мы считаем шаблоном почти без вставок на карту. Таким образом, мы думали, что использовать устройство считывания/записи шаблона для контроля доступа к карте, как этот
boost::mutex& lock_;
bool found = false;
{
shared_lock<boost::shared_mutex> slock(lock_);
(search the map to see if you have key)
if (keyFound) {
found = true;
}
}
if (!found) {
upgrade_lock<boost::shared_mutex> ulock(lock_);
(search the map again to see if the key has been inserted)
if (key still found) {
upgrade_to_unique_lock<boost::shared_mutex> wlock(ulock);
insert into the map & do whatever
}
}
оригинальный shared_lock должен быть уничтожен, когда блок выходит из области видимости, делает upgrade_lock единственный замок, если оригинальный shared_lock не удался.
Наблюдение:
Всего нашего резьба застрял в течение нескольких дней в
_lll_lock_wait or pthread_mutex_lock
При рытье в реализацию подталкивания :: shared_mutex, мы находим, что есть один общий «state_changed» замок внутри мьютекса, и для успеха shared_lock или unique_lock ему необходимо приобрести общий замок state_changed для блокировки и уничтожения. Кажется, что unique_lock войдет в состояние, в котором может освободить scoped_lock на state_changed, но мы не можем сказать. В любом случае, мы не можем сказать, почему потоки в основном блокируются в течение длительных периодов времени со спорадическим прогрессом - это не совсем тупик, а что-то близко.
Любая помощь приветствуется.
Сэм Appleton
Просмотрите [журнал изменений] (http://www.boost.org/doc/libs/1_57_0/doc/html/thread/changes.html), в частности, по вопросу № 7755. Это может быть проблема, с которой вы сталкиваетесь? –
@IgorR. как это звучит, я бы оценил это как ответ. Он отвечает на вопрос, который конкретно «что здесь происходит». И Q & A имеет много общественных достоинств. – sehe
@sehe Done. (На самом деле я хотел подождать и посмотреть, действительно ли это решает проблему, но, с другой стороны, ответ не обязательно должен быть правильным :)). –