Разговор о Мьютексе

Разница между Spinlock и Mutex. Спин-блокировка продолжает вращаться, а мьютекс вызывает yield(), чтобы отказаться от одного раунда расписания для других процессов.

struct thread_mutex {
    uint locked;
};
static thread_mutex mlock;
void atomic_function(struct shared_data *data) {
  mutex_acquire(&mlock);
  data->counter++;
  mutex_release(&mlock);
}
mutex_acquire(struct thread_mutex *mlock) {
  while(xchg(&mlock->locked, 1) != 0)
    yield();
  __sync_synchronize();
}
mutex_release(struct thread_mutex *mlock) {
  mlock->locked = 0;
}

Условные переменные и семафор

Semaphore — это мьютекс на основе счетчика. Вот фрагмент кода, как реализовать семафор

struct sem_t {
  int count;
  mutex_t m;
  condition_t cv;
}
int sem_init(sem_t *s, int value) {
  s->count = value;
  mutex_init(&s->m, NULL);
  cont_init(&s->cv, NULL);
  return 0;
}
// recv
sem_wait(sem_t *s) {
  mutex_lock(&s->m);
  while(s->count == 0)
    cont_wait(&s->cv, &s->m); // the lock the first one temporarily release the mutex
  s->count--; // recv
  mutex_unlock(&s->m);
}
// send
sem_post(sem_t *s) {
  mutex_lock(&s->m);
  s->count++;
  cond_signal(&s->cv);
  mutex_unlock(&s->m);
}

Процесс очень похож на модель пробуждения/сна в предыдущем посте. Используйте условную блокировку как ptable-›lock.

Ссылки