2010-10-18 2 views
2

У меня есть пул потоков, который использует общие мьютексы из библиотеки boost.Пример использования scoped try_shared_lock и блокировки обновления в boost

В то время как ответы на мой другой вопрос, были полезны, Example of how to use boost upgradeable mutexes

То, что я понял, что я на самом деле нужно, чтобы не блокировать, если общий замок или обновить замок не может быть получено. К сожалению, в документах повышения эффективности отсутствуют примеры использования.

Может ли кто-нибудь указать мне или предоставить пример использования shared_lock таким образом.

т.е.

boost:shared_mutex mutex; 

void thread() 
{ 
    // try to obtain a scoped shared lock 
    // How do I do that? 
} 

void thread2() 
{ 
    // try to obtain a scoped upgrade lock 
    // and then a scoped unique lock 
} 

ответ

8

Ответ, кажется, что вы можете обеспечить форсиро- try_to_lock в качестве параметра для нескольких из этих контекстных замков.

например.

boost::shared_mutex mutex; 

// The reader version 
boost::shared_lock<boost::shared_mutex> lock(mutex, boost::try_to_lock); 
if (lock){ 
    // We have obtained a shared lock 
} 

// Writer version 
boost::upgrade_lock<boost::shared_mutex> write_lock(mutex, boost::try_to_lock); 
if (write_lock){ 
    boost::upgrade_to_unique_lock<boost::shared_mutex> unique_lock(write_lock); 
    // exclusive access now obtained. 
} 

EDIT: Я также обнаружил экспериментальным путем, что upgrade_to_unique_lock потерпит неудачу, если у вас нет блокировки обновления. Вы также можете сделать это:

boost::upgrade_to_unique_lock<boost::shared_mutex> unique_lock(write_lock); 
if (unique_lock){ 
    // we are the only thread in here... safe to do stuff to our shared resource 
} 

// If you need to downgrade then you can also call 
unique_lock.release(); 

// And if you want to release the upgrade lock as well (since only one thread can have upgraded status at a time) 
write_lock.unlock(). 

Примечание: Вы должны вызвать релиз следует разблокировать или вы получаете замок исключение брошено. Вы можете, конечно, просто позволить unique_lock и write_lock выйти из сферы действия, тем самым освободив блокировки, хотя я обнаружил, что иногда вы хотите выпустить его раньше, и вы должны тратить в этом состоянии минимальное время.

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