# 2016q3 Homework2(phonebook-concurrent)
contributed by <`LitSnow`>
## 開發環境
* CPU: Intel(R) Core(TM) i5-3337U CPU @ 1.80GHz
* MEM : 8GB
* cache:
* L1d cache:32K
* L1i cache:32K
* L2 cache:256K
* L3 cache:3072K
* Linux version 4.4.0-21-generic
## Concurrency 資料閱讀
* Concurrency v.s Parallelism
* Concurrency:2 個任務分配到 1 個CPU核心,在各自取得的時間片段中交互執行 ,這兩個任務可以完全不相關
* Parallelism:2 個任務分配到 2 個CPU核心,同時執行。或是 1 個任務用 2 個CPU核心去執行
* Concurrency必須著重 thread 之間的互動與溝通
## Code Refactoring
* main.c
只 free 了兩個 node
```clike=
if (pHead->pNext) free(pHead->pNext);
free(pHead);
```
改成
```clike=
while (pHead != NULL) {
e = pHead;
pHead = pHead->pNext;
free(e);
}
```
掃描所有 node , 將其 free 掉
* main.c
第 3 行和第 7 行可以看出迴圈從 head 指向的下一筆資料開始執行 , 故把這兩行的`->lastName`刪除
```clike=
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);
}
...(省略)
}
```
改成
```clike=
for (int i = 0; i < THREAD_NUM; i++) {
if (i == 0) {
pHead = app[i]->pHead;
dprintf("Connect %d head string %s %p\n", i,
app[i]->pHead->pNext->lastName, app[i]->ptr);
} else {
etmp->pNext = app[i]->pHead;
dprintf("Connect %d head string %s %p\n", i,
app[i]->pHead->pNext->lastName, app[i]->ptr);
}
...(省略)
}
```
## 範例程式碼
* 測試結果
* thread_num = 1

* thread_num = 2

* thread_num = 4

* thread_num = 8

* thread_num = 16

* thread_num = 1024

* 分析
* thread 太多導致執行時間更慢,研判是過多的 context switch 造成的
>> 不能只有貼圖,要解釋時間變化怎麼來的,以及你接下來要做什麼。工程人員要解決問題! [name=jserv]
## 參考資料
* [A06: phonebook-concurrent作業說明](https://hackmd.io/s/rJsgh0na)
* [Lim Wen Sheng同學共筆](https://hackmd.io/s/rk5IVI0a)
* [林哲亙同學共筆](https://hackmd.io/s/rJPYFYRa)