# 2016q3 Homework2 (phonebook-concurrent)
contributed by <`GoblinBear`>
## Thread 研讀
[linux線程同步(2)-條件變數](http://www.zendei.com/article/1643.html)
>> 請閱讀英文的材料,最好是 Linux man-page 或 Open Group 提供的版本,這樣才能反映最新的系統行為 [name=jserv]
## 案例分析:Phonebook-concurrent
### 資料閱讀
[記憶體映射函數 mmap 的使用方法](http://welkinchen.pixnet.net/blog/post/41312211-%E8%A8%98%E6%86%B6%E9%AB%94%E6%98%A0%E5%B0%84%E5%87%BD%E6%95%B8-mmap-%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95)
>> 請閱讀英文的材料,最好是 Linux man-page 或 Open Group 提供的版本,這樣才能反映最新的系統行為 [name=jserv]
[mmap](http://man7.org/linux/man-pages/man2/mmap.2.html)
[pthread_setconcurrency(3) - Linux manual page - man7.org](http://man7.org/linux/man-pages/man3/pthread_getconcurrency.3.html)
### 資料整理
#### mmap
### 理解程式碼
```clike
typedef struct _append_a {
char *ptr; // 存放每個 lastName 的起始位址
char *eptr;
int tid; // thread id
int nthread; // thread 的總數
entry *entryStart; // thread 物件的位址
entry *pHead;
entry *pLast;
} append_a;
```
```clike
char *map = mmap(NULL, fs, PROT_READ, MAP_SHARED, fd, 0);
```
=> 建立記憶體映射,map 映射開始的位址指標
>> 你真的讀過 man page 了嗎?這個系統呼叫的作用遠遠超過上述這句話 [name=jserv]
```clike
pthread_setconcurrency(THREAD_NUM + 1);
```
=> 提示系統表明希望的並行度 (只是提示,系統不保證採用)
```clike
pthread_t *tid = (pthread_t *) malloc(sizeof( pthread_t) * THREAD_NUM);
```
=> 建立存放 thread 的陣列
```clike
append_a **app = (append_a **) malloc(sizeof(append_a *) * THREAD_NUM);
```
=> 建立存放 append_a 的指標的陣列
```clike
for (int i = 0; i < THREAD_NUM; i++)
pthread_create( &tid[i], NULL, (void *) &append, (void *) app[i]);
```
=> 透過 POSIX Thread 建立各自獨立的 linked list
```clike
entry *etmp;
pHead = pHead->pNext;
for (int i = 0; i < THREAD_NUM; i++) {
if (i == 0) {
pHead = app[i]->pHead->pNext;
dprintf("Connect %d head string %s %p\n", i, app[i]->pHead->pNext->lastName, app[i]->ptr);
} else {
etmp->pNext = app[i]->pHead->pNext;
dprintf("Connect %d head string %s %p\n", i, app[i]->pHead->pNext->lastName, app[i]->ptr);
}
etmp = app[i]->pLast;
dprintf("Connect %d tail string %s %p\n", i, app[i]->pLast->lastName, app[i]->ptr);
dprintf("round %d\n", i);
}
```
=> 最終合併為單一 list
### Thread 搭配 mmap 實驗
- Thread num = 1

- Thread num = 2

- Thread num = 4

- Thread num = 8

**Thread num = 2 時速度最快**