2016-11-10 2 views
0

Есть две нити (назовем их 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(); 
} 

Допустим, я могу gugarntee, что thread2 приходят сначала подождите, а затем thread1 сделает уведомление.

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

+0

Как правило? Нет. В вашем коде? Кто знает. Возможно, если вы разместите его. –

ответ

1

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

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