2010-10-18 1 views
2

J'ai un pool de threads qui utilise des mutex partagés de la bibliothèque boost.Exemple d'utilisation de try_shared_lock étendu et de verrou de mise à niveau en mode boost

Alors que les réponses à mon autre question ont été utiles, Example of how to use boost upgradeable mutexes

Ce que je me suis rendu compte que ce que je réellement besoin est de ne pas bloquer si un verrou partagé ou verrou de mise à niveau ne peut pas être obtenue. Malheureusement, les docs de boost manquent d'exemples de ceux en usage.

Est-ce que quelqu'un peut me diriger vers ou donner un exemple de plus précisément le shared_lock utilisé de cette façon.

à savoir

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 
} 

Répondre

8

La réponse semble être que vous pouvez fournir boost: try_to_lock comme paramètre à plusieurs de ces verrous scope.

par exemple.

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: Je aussi trouvé par l'expérimentation que upgrade_to_unique_lock échouera si vous ne possédez pas le verrou de mise à niveau. Vous pouvez aussi le faire:

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(). 

Note: Vous devez .L'appel suivi de déverrouillage ou vous aurez une exception de verrouillage jeté. Vous pouvez bien sûr simplement laisser les verrous uniques et les verrous d'écriture, libérant ainsi les verrous, bien que j'ai parfois trouvé que vous vouliez les libérer plus tôt et que vous devriez passer un minimum de temps dans cet état.

Questions connexes