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.