У меня есть поток, A, чья функция работает в цикле, что-то делает и пробуждает другой поток, B, вверх. Затем он освобождает мьютекс и переходит к следующей итерации. Поток B ждет, пока не получит сигнал, затем что-то делает. Мой вопрос таков: гарантируется ли, что B получит мьютекс после сигнализации или может ли поток A повторно получить мьютекс перед B на следующей итерации цикла?
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t signal = PTHREAD_COND_INITIALIZER;
int condition=0;
//function for thread A
void func_A(void *arg){
while(1) {
pthread_mutex_lock(&lock);
do_something();
condition=1;
pthread_cond_signal(&signal);
pthread_mutex_unlock(&lock);
}
}
//function for thread B
void func_B(void *arg) {
while(1) {
pthread_mutex_lock(&lock);
while(condition = 0)
pthread_cond_wait(&signal, &lock);
do_something_else();
condition=0;
pthread_mutex_unlock(&lock);
}
}
Есть ли способ убедиться, что B получает мьютекс после того, как ему было сообщено?