Последовательность выполнения после уведомления условной переменной

Есть два потока (назовем их T1 и T2), которые синхронизируются друг с другом с помощью переменной условия повышения и мьютекса, например:

boost::condition_variable global_cond;
boost::mutex global_mutex;
boost::unique_lock<boost::mutex> lock( global_mutex);

thread1() {
  global_cond.notify_one();
  code_block_a();
}

tread2() {
  global_cond.wait(lock)
  code_block_b();
}

Допустим, я могу предусмотреть, что поток 2 сначала будет ждать, а затем поток 1 сделает уведомление.

Мой вопрос в том, является ли детерминированным то, что code_block_a() или code_block_b() будут выполняться первыми?


person user2191818    schedule 10.11.2016    source источник
comment
В общем? Нет. В вашем коде? Кто знает. Может, если бы ты выложил.   -  person Michael Foukarakis    schedule 10.11.2016


Ответы (1)


Не гарантировано. Система может выполнить переключение контекста сразу после thread1, вызванного notify_one(), и разрешить выполнение thread2(). А может и нет.

Обратите внимание, что ваш код, как правило, содержит ошибки, потому что global_cond.wait(lock) может быть ложно разбужен, а tread2 может запускать code_block_b() даже до того, как запустится thread1().

person Roman    schedule 10.11.2016