Мне нужно создать 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....
Итак, я пытаюсь сделать следующее: если проверка верна, только один поток может выполнить задачу, иначе каждый поток может выполнить задачу. Вот почему я хочу создать общую блокировку. Таким образом, каждый поток может получить доступ к ресурсу (вектор в моем случае)
Все потоки пытаются изменить вектор, но тип блокировки отправляется клиентом, поэтому мне нужно создать блокировку на основе значения этого логического параметра.
@NathanOliver Я тоже не видел другого варианта. Спасибо
Поскольку вызывающий абонент в любом случае передает условие 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();
}
К сожалению, мне не разрешено изменять параметры функции или разбивать код на несколько функций.
Как это?
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....
u.lock действителен только в пределах области if, он не блокирует всю функцию
@AhmetTanakol Нет. u.lock();
- это вызов функции. Он не создает ничего, что выходит за рамки.
Вы можете сделать
doTask....
функцией, а затем вызывать эту функцию в каждой ветке.