根据条件

时间:2018-05-01 21:43:49

标签: c++ locking

我需要根据我的函数中的参数创建unique_lock或共享锁。我无法在功能范围内正确定义。所以我需要做这样的事情。

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

2 个答案:

答案 0 :(得分:2)

喜欢这个吗?

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

答案 1 :(得分:0)

由于调用者无论如何都要传递check条件,您可以给function一个模板参数让调用者指定要使用的锁类型,例如:

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

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

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

否则,您可以将代码拆分为多个函数:

doTask() {
  ...
}

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

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