typedef struct { volatile int counter; } atomic_t;
atomic_t u; /* 초기화 하지 않은 상태로 u를 정의 */ atomic_t v = ATOMIC_INIT(0); /* v를 정의하고 0으로 초기화 */
atomic_t v = 0; /* 잘못된 초기화다 */
atomic_set(&v, 4); /* v->counter = 4 (atomically) */ atomic_add(2, &v); /* v->counter = v->counter + 2 = 6 (atomically) */ atomic_inc(&v); /* v->counter = v->counter + 1 = 7 (atomically) */
spinlock_t mr_lock = SPIN_LOCK_UNLOCKED; spin_lock(&mr_lock); /* critical region ... */ spin_unlock(&mr_lock);
spinlock_t mr_lock = SPIN_LOCK_UNLOCKED; unsigned long flags; spin_lock_irqsave(&mr_lock, flags); /* critical region ... */ spin_unlock_irqrestore(&mr_lock, flags);
spinlock_t mr_lock = SPIN_LOCK_UNLOCKED; spin_lock_irq(&mr_lock); /* critical region ... */ spin_unlock_irq(&mr_lock);
rwlock_t mr_rwlock = RW_LOCK_UNLOCKED;
read_lock(&mr_rwlock); /* critical section (read only) ... */ read_unlock(&mr_rwlock);라이터인 경우에는 다음과 같이 사용한다.
write_lock(&mr_lock); /* critical section (read and write) ... */ write_unlock(&mr_rwlock);
if (down_interruptible(&mr_sem)) return -ERESTARTSYS; /* 시그널을 받았지만 세마포어를 얻지 못함 */ /* critical region ... */ up(&mr_sem);
down_read(&mr_rwsem); /* critical region (read only) ... */ up_read(&mr_rwsem); down_write(&mr_rwsem); /* critical region (read and write) ... */ up_write(&mr_rwsem);
요구사항 | 추천방법 |
록 부담이 적어야 하는 경우 | 스핀록을 추천 |
록 기간이 짧은 경우 | 스핀록을 추천 |
록 기간이 긴 경우 | 세마포어를 추천 |
인터럽트 핸들러에서 록을 해야 하는 경우 | 반드시 스핀록을 사용 |
록을 소유한 채 휴면해야 하는 경우 | 반드시 세마포어를 사용 |
seqlock_t mr_seq_lock = SEQLOCK_UNLOCKED; write_seqlock(&mr_seq_lock); /* write lock is obtained ... */ write_sequnlock(&mr_seq_lock); unsigned long seq; do { seq = read_seqbegin(&mr_seq_lock); /* read data here ... */ } while (read_seqretry(&mr_seq_lock, seq));
preempt_disable(); /* 선점이 비활성화됨 ... */ preempt_enable();