C++ 根据条件创建共享锁定或唯一锁定

C++ 根据条件创建共享锁定或唯一锁定,c++,locking,C++,Locking,我需要根据函数中的参数创建唯一锁定或共享锁定。我无法正确定义函数的范围。所以我需要这样做 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.... 功能

我需要根据函数中的参数创建唯一锁定或共享锁定。我无法正确定义函数的范围。所以我需要这样做

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....
功能(布尔检查){
锁
如果(检查){
锁=标准::唯一锁(互斥锁);
}否则{
锁=标准::共享锁(互斥锁);
}
lock.lock();
多塔克。。。。

由于调用者无论如何都在传递
检查
条件,您可以为
函数
提供一个模板参数,让调用者指定要使用的锁的类型,例如:

template<typename LockClass>
function () {
 LockClass<std::shared_mutex> lock(mutex);
 doTask....
}
模板
函数(){
锁类锁(互斥锁);
多塔克。。。。
}

//函数(true);
函数();

//函数(false);
函数();
否则,您可以将代码拆分为多个函数:

doTask() {
  ...
}

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

shared_function () {
  std::shared_lock<std::shared_mutex> lock(mutex);
  doTask();
}
doTask(){
...
}
唯一函数(){
std::唯一锁(互斥锁);
doTask();
}
共享函数(){
std::共享_锁(互斥锁);
doTask();
}
像这样吗

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....
void函数(布尔检查){
std::unique_lock u(互斥锁,std::defer_lock);
std::共享锁(互斥锁,std::延迟锁);
如果(检查){
u、 锁();
}否则{
s、 锁();
}
多塔克。。。。

您可以创建
doTask….
一个函数,然后在每个分支中调用该函数。因此,如果check为true,则只有一个线程可以执行该任务,否则每个线程都可以执行该任务。这就是我想创建共享锁的原因。因此,每个线程都可以访问资源(在我的例子中是一个向量)所有线程都试图修改一个向量,但是锁类型是由客户端发送的,所以我需要基于这个布尔值创建一个锁parameter@NathanOliver我也看不到任何其他选项。幸运的是,不允许我更改函数参数或将代码拆分为多个函数。锁定仅在if范围内有效,它不会锁定整个系统function@AhmetTanakol不。
u.lock();
是一个函数调用。它不会构造超出范围的任何内容。
doTask() {
  ...
}

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

shared_function () {
  std::shared_lock<std::shared_mutex> lock(mutex);
  doTask();
}
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....