Вам нужно гуглить понятия «атомарной операции» в контексте «переключения контекста», а также идею мьютекса.
По сути, мьютекс - это логическое значение, которое устанавливается или очищается вашими потоками.
Каждая нить будет:
function pop () {
Get_Mutex ();
do_the_pop_operation ();
Free_Mutex ();
}
или
функция push () {
Get_Mutex ();
do_the_push_operation ();
Free_Mutex ();
}
Функция Get_Mutex () будет находиться в спящем режиме до получения мьютекса, поэтому одновременно может выполняться только одна операция.