Рассмотрите эту базовую многопоточную программу, используя pthreads. У нас есть основной поток, создающий еще один поток, который выполняет некоторую работу.Статус Mutex после ложного пробуждения
bool done = false;
mutex m;
condition c;
void foo() {
pthread_mutex_lock(&m);
//while(!done) {
pthread_cond_wait(&c, &m);
// Spuriously wakeup while child is doing work.
// child thread has NOT unlocked the mutex yet
// Do I now own the mutex?
// or am I waiting for child to unlock it?
//}
pthread_mutex_unlock(&m);
}
void * child(void *arg) {
pthread_mutex_lock(&m);
some_intense_work(); // this work is done while mutex is held!
// the main thread spuriously wakes up
// while this work is being done
// (while this child thread is holding the mutex)
done = true;
pthread_cond_broadcast(&c);
pthread_mutex_unlock(&m);
}
int main(int argc, char *argv[]) {
pthread_t p;
pthread_create(&p, NULL, child, NULL);
foo();
}
Притворись, что мы реализуем выжидательную без окружающего While-п проверки для предиката, хотя мы понимаем, что никто не когда-либо должны делать это.
Теперь, если дочерний поток выполняет свою работу, в главном потоке возникает побочная пробуждение, каков будет статус мьютекса m? Будет ли основной поток владеть им без того, чтобы ребенок сначала отпирал его, чтобы оба его обладали?
Или же ложное пробуждение пропускает только ожидание состояния, но не ждет освобождения мьютекса?
Когда ['pthread_cond_wait()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_wait.html) успешно возвращается, текущий поток блокирует мьютекс, независимо от того, является ли пробуждение ложным или нет. Бремя на пробужденный поток, чтобы проверить состояние, ожидание снова, если оно не выполнено. –
, чтобы мы могли технически рассмотреть оба потока, чтобы иметь мьютекс в этот момент? – JMC
Нет; только один поток блокирует мьютекс - вы не можете иметь оба потока с блокировкой мьютекса, потому что это не будет мьютексом. Трансляция не изменяет свойство взаимного исключения мьютекса. –