Есть ли механизм, чтобы условная переменная использовала несколько мьютексов?
Я в Linux и Pthreads в C ++.
В приложении мне нужно, чтобы два мьютекса (вместо одного) были атомарно получены и освобождены pthread_cond_wait (), но функция принимает только один.
У меня есть класс с именем BlockingManager, и у него есть метод:
blockMeFor( pthread_cond_t* my_cond, pthread_mutex_t* my_lock, set<int> waitees);
и я использую его, предполагая, что он получает / освобождает мьютекс точно так же, как pthread_cond_wait.
Проблема в том, что для реализации blockingManager мне также нужен внутренний мьютекс, и оба этих мьютекса должны быть получены и освобождены атомарно.
Здесь как-то связано обсуждение, в котором говорится, что ожидание более чем одного мьютекса приводит к неопределенному поведению.
http://sourceware.org/ml/libc-help/2011-04/msg00011.html
Модель производителя / потребителя для стоящей передо мной проблемы:
У нас есть несколько клиентов.
У каждого клиента есть несколько задач.
Каждая задача, вероятно, имеет несколько предварительных условий (среди задач одного и того же клиента или других клиентов).
У каждого клиента есть один потребительский поток.
Задачи назначаются клиентам из одного потока производителя.
Вновь назначенная задача может быть выполнена до выполнения предыдущих задач.
В некоторые моменты может не быть задачи, но если есть задача, по крайней мере, одна должна быть выполнена. (Это должно сохранить работу)
Я использую один condvar для каждого потока пользователя, и он будет блокироваться, если для этого потока не будет выполнено никаких задач.
Кондвар может быть сигнализирован либо
Поток производителя, назначающий новую задачу.
Еще один потребительский поток, завершающий задачу.
Я использую один мьютекс на каждого потребителя для защиты общих структур данных между производителем и потребителем.
И один мьютекс (внутренний мьютекс) для защиты общих структур данных между несколькими потребителями.