# 並行程式設計
NP: non-portable
本篇為此課程的筆記: Ref: [並行程式設計](https://hackmd.io/@sysprog/concurrency/https%3A%2F%2Fhackmd.io%2F%40sysprog%2FS1AMIFt0D)
```clike=
/*
* mod N 是一種乘除運算,很耗運算資源
* 若N為2^n其實可以改用 &
*
* */
若 N=2^n
[a mod N] = [a&(N-1)]
```
---
Linux kernel Completion
* 是一種特別的lock
---
[Ring Buffer](https://github.com/angrave/SystemProgramming/wiki/Synchronization%2C-Part-8%3A-Ring-Buffer-Example)
```clike=
#include <pthread.h>
#include <semaphore.h>
// N must be 2^i
#define N (16)
void *b[N]
int in = 0, out = 0
p_m_t lock = PTHREAD_MUTEX_INITIALIZER// must init!!!
sem_t countsem, spacesem
void init() {
sem_init(&countsem, 0, 0)//@0: sem, @1 process free?, @2: counter
sem_init(&spacesem, 0, 16)
}
enqueue(void *value){
// wait if there is no space left:
sem_wait( &spacesem )
p_m_lock(&lock)
b[ (in++) & (N-1) ] = value
p_m_unlock(&lock)
// increment the count of the number of items
sem_post(&countsem)
}
void *dequeue(){
// Wait if there are no items in the buffer
sem_wait(&countsem)
p_m_lock(&lock)
void *result = b[(out++) & (N-1)]
p_m_unlock(&lock)
// Increment the count of the number of spaces
sem_post(&spacesem)
return result
}
}
```