Вот эксперимент с использованием класса C++ thread
.Обязательны ли переменные условий для блокировки мьютекса?
Начальные условия (ИС):
- Поток А имеет переменную условие, ожидающий на замок (на мьютекса).
- Резьба B имеет блокировку мьютекса.
- Нить C ничего не сделала.
В настоящее время поток C вызывает m.lock()
(при создании блокировки). Затем поток B уведомляет переменную условия. Означает ли тот факт, что поток A ожидает переменную условия, ожидающую блокировки этого мьютекса, делает его более или менее вероятным, что он сначала заблокирует мьютекс, или же поток C так же вероятен?
Вот пример того, что я имею в виду:
#include <condition_variable>
#include <mutex>
#include <thread>
std::condition_variable cv;
std::mutex m;
void funcB()
{
std::unique_lock<std::mutex> B_lk(m);
sleep(2); // allow thread C to attempt lock; IC-2
cv.notify_one();
B_lk.unlock();
}
void funcC()
{
sleep(1); // allow thread B to lock; IC-3
std::unique_lock<std::mutex> C_lk(m);
/* Perform task C */
}
int main (int argc, char* argv[]) // thread A
{
std::unique_lock<std::mutex> A_lk(m);
std::thread threadB(funcB);
std::thread threadC(funcC);
cv.wait(A_lk); // IC-1
/* Perform task A */
/* Clean up and return */
}
Я думаю, что нити А и С (теоретически, во всяком случае) с равной вероятностью заблокировать мьютекс после потока B разблокирует его, потому что я не видел ни одного упоминания приоритета в стандарте C++. Я прочитал многие другие вопросы о приоритете блокировки здесь, на SO, но я не мог найти ответа на этот конкретный вопрос.
Правильно, вот что я читал. Разблокирует, но не обязательно означает, что поток может блокироваться. Просто задал вопрос, чтобы убедиться, что я ничего не пропустил. – Cerran