Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Example for boost shared_mutex (multiple reads/one write)?

I have a multithreaded app that has to read some data often, and occasionally that data is updated. Right now a mutex keeps access to that data safe, but it's expensive because I would like multiple threads to be able to read simultaneously, and only lock them out when an update is needed (the updating thread could wait for the other threads to finish).

I think this is what boost::shared_mutex is supposed to do, but I'm not clear on how to use it, and haven't found a clear example.

Does anyone have a simple example I could use to get started?

like image 640
kevin42 Avatar asked Jun 13 '09 02:06

kevin42


1 Answers

1800 INFORMATION is more or less correct, but there are a few issues I wanted to correct.

boost::shared_mutex _access; void reader() {   boost::shared_lock< boost::shared_mutex > lock(_access);   // do work here, without anyone having exclusive access }  void conditional_writer() {   boost::upgrade_lock< boost::shared_mutex > lock(_access);   // do work here, without anyone having exclusive access    if (something) {     boost::upgrade_to_unique_lock< boost::shared_mutex > uniqueLock(lock);     // do work here, but now you have exclusive access   }    // do more work here, without anyone having exclusive access }  void unconditional_writer() {   boost::unique_lock< boost::shared_mutex > lock(_access);   // do work here, with exclusive access } 

Also Note, unlike a shared_lock, only a single thread can acquire an upgrade_lock at one time, even when it isn't upgraded (which I thought was awkward when I ran into it). So, if all your readers are conditional writers, you need to find another solution.

like image 107
mmocny Avatar answered Sep 22 '22 04:09

mmocny