2014-12-04 4 views
1

Привет 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

+2

Просмотрите [журнал изменений] (http://www.boost.org/doc/libs/1_57_0/doc/html/thread/changes.html), в частности, по вопросу № 7755. Это может быть проблема, с которой вы сталкиваетесь? –

+1

@IgorR. как это звучит, я бы оценил это как ответ. Он отвечает на вопрос, который конкретно «что здесь происходит». И Q & A имеет много общественных достоинств. – sehe

+0

@sehe Done. (На самом деле я хотел подождать и посмотреть, действительно ли это решает проблему, но, с другой стороны, ответ не обязательно должен быть правильным :)). –

ответ

1

Примите взгляд на Boost.Threadchange log, в частности, на вопрос # 7755 "Тема: тупиковая с shared_mutex на Windows", который был зафиксирован в 1.54. Это может быть проблема, с которой вы сталкиваетесь.

Кстати, исправлено множество ошибок Boost.Thread с 1.50, поэтому стоит обновить до последней версии.

+0

Это довольно правдоподобно. Я бы сказал, что OP, по крайней мере, должен протестировать версию (patch from) версии 1.54, чтобы увидеть, устраняет ли она проблему! – sehe

+0

Спасибо - мы попытаемся использовать 1.57, чтобы узнать, разрешена ли проблема. –

Смежные вопросы