2014-02-12 4 views
1

Вот эксперимент с использованием класса C++ thread.Обязательны ли переменные условий для блокировки мьютекса?

Начальные условия (ИС):

  1. Поток А имеет переменную условие, ожидающий на замок (на мьютекса).
  2. Резьба B имеет блокировку мьютекса.
  3. Нить 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, но я не мог найти ответа на этот конкретный вопрос.

ответ

1

Это намеренно не определено стандартом, позволяющим свободу осуществления. В частности, C++ 11 §30.5.1 класса condition variable [thread.condition.condvar] гласит:

void notify_one() noexcept; 

Эффекты: Если какие-либо потоки блокируются в ожидании *this, разблокирует один из тех, потоки.

void notify_all() noexcept; 

Эффекты: разблокирует все потоки, заблокированные в ожидании *this.

Претензии/справедливость/приоритет ни к какой теме (-ам) не требуется, просто «разблокирует один» или «разблокирует все».

+0

Правильно, вот что я читал. Разблокирует, но не обязательно означает, что поток может блокироваться. Просто задал вопрос, чтобы убедиться, что я ничего не пропустил. – Cerran

Смежные вопросы