简体   繁体   中英

Create shared_lock or unique_lock based on a condition

I need to create unique_lock or shared lock based on a parameter in my function. I couldn't define properly in the scope of function. So I need to do something like this.

function (bool check) {
 lock;
 if (check) {
  lock = std::unique_lock<std::shared_mutex>(mutex);
 } else {
  lock = std::shared_lock<std::shared_mutex>(mutex);
 }
 lock.lock();
 doTask....

Like this?

void function (bool check) {
  std::unique_lock<std::shared_mutex> u(mutex, std::defer_lock);
  std::shared_lock<std::shared_mutex> s(mutex, std::defer_lock);
  if (check) {
    u.lock();
  } else {
    s.lock();
  }
  doTask....

Since the caller is passing in the check condition anyway, you could give your function a template parameter to let the caller specify which type of lock to use, eg:

template<typename LockClass>
function () {
 LockClass<std::shared_mutex> lock(mutex);
 doTask....
}

//function (true);
function<std::unique_lock>();

//function (false);
function<std::shared_lock>();

Otherwise, you could split your code into multiple functions:

doTask() {
  ...
}

unique_function () {
  std::unique_lock<std::shared_mutex> lock(mutex);
  doTask();
}

shared_function () {
  std::shared_lock<std::shared_mutex> lock(mutex);
  doTask();
}

Use std::variant :

void function (bool check)
{
 std::variant<std::shared_lock<std::shared_mutex>, std::unique_lock<std::shared_mutex>> lock;
 if (check) {
 lock = std::unique_lock(mut);
 } else {
 lock = std::shared_lock(mut);
 }
 //doTask...
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM