# 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 ![](https://i.imgur.com/nOZJiC5.png) - Thread num = 2 ![](https://i.imgur.com/ybNMdip.png) - Thread num = 4 ![](https://i.imgur.com/aaw2WOd.png) - Thread num = 8 ![](https://i.imgur.com/M37oTXa.png) **Thread num = 2 時速度最快**