contributed by <a530788140
>
pthread_t a_thread;
pthread_attr_t a_thread_attribute;
void thread_function(void *argument);
char *some_argument;
pthread_create( &a_thread, a_thread_attribute, (void *)&thread_function,
(void *) &some_argument);
timming delay 來達成thread間的同步是錯誤的,因為 thread 間的緊密耦合(tightly coupled)特性很容易讓我們使用一些不精確的方法來達成其間的同步處理,如果要讓thread 停頓可以使用pthread_delay_np (np 表示 not portable)函式。
在 POSIX Thread 中,
_np
表示 not portable jserv
pthread_mutex_init()
pthread_mutex_lock() //需先lock mutex,看看buffer 中是否有資料,若有資料則將其取出
請不要活在「腦補」的世界中,再次詳細閱讀 man page: pthread_mutex_lock jserv
已修改 謝謝老師提醒儂偉
pthread_mutex_lock() //用來鎖定thread,直到mutex變為可用狀態
pthread_mutex_unlock()
pthread_mutex_destroy() //釋放 mutex
semaphore_init() //使用 semaphore 前必須呼叫 init 函數,初始值均為 1
semaphore_up() //遞增 semaphore
semaphore_down() //運算將在 semaphore 值小於或等於零時暫停
semaphore_destroy() //釋放semaphore
semaphore_decrement()
<pthread.h>
) cc hello_world.c -o hello_world -lpthread
注意: 有兩個完全不同的 semaphore 實作,一個是 System V semaphore,另一個是 POSIX semaphore,請參閱討論 What are the trade-offs between using a System V and a Posix semaphore? jserv
謝謝老師提醒儂偉
由Semaphores in Linux這個網站所列出的主要差異,並整理出來下列幾項
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
int munmap(void *addr, size_t length);
尊重我們的傳統文化,請用台灣慣用術語。process = 行程; call = 呼叫; virtual memory = 虛擬記憶體; address space = 定址空間; file = 檔案; access = 存取; return = 傳回; create = 建立; jserv
已修改,以後會多加注意儂偉
參考mbrossard 完整的 ThreadPool 原始碼
新增phonebook_threadpool來與opt做比較
並在main裡新增了下列程式碼
#if defined THREADPOOL
#define QUEUE 256
extern threadpool_t *pool;
extern pthread_mutex_t lock;
pthread_mutex_init(&lock, NULL);
assert((pool = threadpool_create(THREAD_NUM, QUEUE, 0)) != NULL);
append_a **app = (append_a **) malloc(sizeof(append_a *) * THREAD_NUM);
for (int i = 0; i < THREAD_NUM; i++)
app[i] = new_append_a(map + MAX_LAST_NAME_SIZE * i, map + fs, i,
THREAD_NUM, entry_pool + i);
for (int i = 0; i < THREAD_NUM; i++) {
threadpool_add(pool, &append, (void *) app[i] , 0);
}
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);
}
clock_gettime(CLOCK_REALTIME, &end);
cpu_time1 = diff_in_second(start, end);
assert(threadpool_destroy(pool, 0) == 0);
遇到問題 findname一直失敗,待解決儂偉
[New Thread 0x7ffff6a96700 (LWP 4518)]
[New Thread 0x7ffff6295700 (LWP 4519)]
[New Thread 0x7ffff5a94700 (LWP 4520)]
[New Thread 0x7ffff5293700 (LWP 4521)]
[Thread 0x7ffff5293700 (LWP 4521) exited]
[Thread 0x7ffff6295700 (LWP 4519) exited]
[Thread 0x7ffff5a94700 (LWP 4520) exited]
[Thread 0x7ffff6a96700 (LWP 4518) exited]
Breakpoint 1, main (argc=1, argv=0x7fffffffde68) at main.c:106
106 pHead = pHead->pNext;
(gdb) p entry_pool[2]->lastName
$1 = 0x0
(gdb) p entry_pool[3]->lastName
$2 = 0x0
(gdb) p entry_pool[4]->lastName
$3 = 0x7ffff729a040 "aaaaaaaa\n"
(gdb) p entry_pool[5]->lastName
$4 = 0x0
(gdb) p entry_pool[8]->lastName
$5 = 0x7ffff729a080 "aaaaaahhhhh\n"
發現只有app[0]的thread有執行,待解決儂偉
assert(threadpool_destroy(pool, 1) == 0);
將上面0改成1,解決Thread未完成被shutdown的問題
發現apped的速度反而變慢,可是當我THREAD數量增加時,threadpool的速度會增加,但OPT卻下降儂偉
發現在Thread=8時cache-misses最高,但還在思考原因,待有人可以討論和解答。儂偉
由於上禮拜被老師指出這方面的缺失,並且根據老師給的資料重新學習
$git log --oneline -5
可以查詢commit資訊了解到了寫好git commit的重要性儂偉