Presentation is loading. Please wait.

Presentation is loading. Please wait.

Pthread.

Similar presentations


Presentation on theme: "Pthread."— Presentation transcript:

1 pthread

2 先安裝程式設計師手冊 sudo apt-get install manpages-posix manpages-posix-dev

3 pthread_create() int pthread_create(pthread_t *tid , const pthread_attr_t *attr , void *(*function)(void *) , void *argument) tid,建立thread必備的資料結構,代表新建立的thread attr,新建立的thread的屬性,一般填入NULL function,該thread所要執行的函數的名稱 argumentt傳遞給上述函數的參數 正確回傳0,錯誤則看errno

4 建立一個pthread-nosync #include <stdio.h> #include <pthread.h>
int global=0; void thread(void) { int i; for (i=0; i< ; i++) global+=1; }

5 建立一個pthread-nosync int main(void) { pthread_t id1, id2;
pthread_create(&id1,NULL,(void *) thread,NULL); pthread_create(&id2,NULL,(void *) thread,NULL); pthread_join(id1,NULL); pthread_join(id2,NULL); printf(" = %d\n", global); return (0); }

6 執行結果 ./nosync = real 0m0.007s user 0m0.008s sys 0m0.000s

7 結果討論 因為二個執行緒共用一個變數,而且沒有任何同步機制,這會造 成二個執行緒彼此覆寫全域變數

8 semaphore #include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int value); sem:要初始化的semaphore的物件指標 pshared:0該semaphore給執行緒使用,1給行程使用 value:要將semaphore初始化成value

9 post and wait #include <semaphore.h> int sem_post(sem_t *sem);
int sem_wait(sem_t *sem); sem_post離開全域變數存取區間 sem_wait準備進入全域變數存取區間

10 使用semaphore #include <stdio.h> #include <pthread.h>
#include <semaphore.h> int global=0; sem_t semaphores; void thread(void) { int i; for (i=0; i< ; i++) { sem_wait(&semaphores); global+=1; sem_post(&semaphores); }

11 使用semaphore } int main(void) { pthread_t id1, id2;
sem_init(&semaphores, 0, 1); pthread_create(&id1,NULL,(void *) thread,NULL); pthread_create(&id2,NULL,(void *) thread,NULL); pthread_join(id1,NULL); pthread_join(id2,NULL); printf(" = %d\n", global); return (0);

12 執行結果 ./semaphore = real 0m0.228s user 0m0.268s sys 0m0.184s

13 結果討論 semaphore是功能強大的同步函數,他的初始值可以是任何整數, 通常semaphore的初始值N代表最多可以有N個執行緒修改全域 變數

14 mutex #include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr) int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); attr:設定這個mutex的屬性,使用預設屬性則傳入NULL

15 使用mutex #include <stdio.h> #include <pthread.h>
#include <semaphore.h> int global=0; pthread_mutex_t mutex; void thread(void) { int i; for (i=0; i< ; i++) { pthread_mutex_lock(&mutex); global+=1; pthread_mutex_unlock(&mutex);

16 使用mutex } int main(void) { pthread_t id1, id2;
pthread_mutex_init(&mutex, NULL); pthread_create(&id1,NULL,(void *) thread,NULL); pthread_create(&id2,NULL,(void *) thread,NULL); pthread_join(id1,NULL); pthread_join(id2,NULL); printf(" = %d\n", global); return (0);

17 執行結果 ./mutex = real 0m0.148s user 0m0.192s sys 0m0.096s

18 結果討論 mutex的值只能是1, 0,這意味著最多只有一個thread能進入全域 變數存取區間

19 複習「關鍵字」「volatile」 在GNU C當中如果一個變數宣告為volatile,那麼這個變數「一定」 會配置在主記憶體。

20 使用volatile(錯誤的程式) #include <stdio.h> #include <pthread.h>
#include <semaphore.h> volatile int global=0; void thread(void) { int i; for (i=0; i< ; i++) global+=1;

21 使用volatile(錯誤的程式) } int main(void) { pthread_t id1, id2;
pthread_create(&id1,NULL,(void *) thread,NULL); pthread_create(&id2,NULL,(void *) thread,NULL); pthread_join(id1,NULL); pthread_join(id2,NULL); printf(" = %d", global); return (0);

22 執行結果 ./volatile = real 0m0.006s user 0m0.004s sys 0m0.000s

23 使用volatile(錯誤的程式) #include <stdio.h> #include <pthread.h>
#include <semaphore.h> volatile int global=0; void thread(void) { int i; for (i=0; i< ; i++) global+=2;

24 結果 ./volatile = real 0m0.009s user 0m0.012s sys 0m0.000s

25 2job #include <stdio.h> #include <pthread.h>
#include <semaphore.h> volatile int global=0; pthread_mutex_t mutex; void thread(void) { int local=0; int i; for (i=0; i< ; i++) local+=1; pthread_mutex_lock(&mutex);

26 2job global+=local; pthread_mutex_unlock(&mutex); } int main(void) {
pthread_t id1, id2; pthread_mutex_init(&mutex, NULL); pthread_create(&id1,NULL,(void *) thread,NULL); pthread_create(&id2,NULL,(void *) thread,NULL); pthread_join(id1,NULL); pthread_join(id2,NULL); printf(" = %d", global); return (0);

27 執行結果 ./2job = real 0m0.005s user 0m0.004s sys 0m0.000s

28 執行結果2 ./2job = real 0m2.192s user 0m4.368s sys 0m0.004s

29 結果討論 同步機制用越少通常效果越好,盡量的找出可以平行處理,又不 需要同步機制的方法。

30 base #include <stdio.h> int global=0;
int main(int argc, char **argv) { int i; for (i=0; i< ; i++) { global+=1; } printf(" = %d\n", global); return 0;

31 執行結果 ./base = real 0m0.005s user 0m0.004s sys 0m0.000s

32 結果比較 base nosync (錯誤) semaphore mutex volatile 平台相依 2job real .005
.007 .228 .148 .006 user .004 .008 .268 .192 sys .000 .184 .096


Download ppt "Pthread."

Similar presentations


Ads by Google