Разговор о Мьютексе
Разница между 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.
Ссылки