2014年10月23日 星期四

AkiiNote Pthread 筆記

Hmmmmmm要從哪開始講起呢






既然是pthread的模板 就又從pthread的模板講起
下面的codepthread模板
大部分簡單的平行化都可以解決 小細節的話再從模板中慢慢加進去

#include <assert.h>
#include <pthread.h>

pthread_t *thread_array = NULL;

int main(){
               thread_array = (pthread_t*) malloc(sizeof(pthread_t) * thread_num);
               for (i = 0; i < thread_num; ++i) {
                               int rc = pthread_create(thread_array+i, &attr, analyzer, (void *) i);
                               assert(rc == 0);
               }
               for (I = 0; I < thread_num; ++i) {
                               pthread_join(thread_array[i], NULL);
               }
               return 0;
}





動態(dynamic)宣告pthread個數
  •  thread_array1static參數 需要事先給值
  •  thread_array2dynamic參數 可以等程式執行到之後再給值

// thread_array1

pthread_t thread_array1[thread_num];
// thread_array2
pthread_t *thread_array2 = NULL;
thread_array2 =  (pthread_t*) malloc(sizeof(pthread_t) * thread_num);
// 開始平行化
pthread_create(thread_array+i, … );
pthread_join(thread_array[i], … );

pthread_create()簡單來說就是create thread
用來跟電腦講說 哪個function需要平行化
int pthread_create(pthread_t *thread,                           
                               const pthread_attr_t *attr,
                               void *(*start_routine) (void *),
                               void *arg);

第一個參數:可以用來設定平行化的維度 簡單來說就是設定同一時間可以有幾個thread在執行
第二個參數:用來設定平行化後分支出去的thread是否要回到main中 等等會講
第三個參數:需要平行化的function
第四個參數:傳遞參數 沒有參數則寫NULL

pthread_join()簡單來說就是join thread
跟電腦講說 分支出去後的thread要在哪裡回來(像是回到main)

int pthread_join(pthread_t thread, void **retval);

第一個參數:要join第幾個thread回來
第二個參數:thread function回傳值


attr
attr 屬性 有兩種
  •  joinable thread:需要呼叫pthread_join()才會停止
  •  detached thread:在thread function中加上pthread_exit()就會結束並釋放資源

畫個圖就淺顯易懂了


pthread_attr_t attr;

pthread_attr_init(&attr);  
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&thread1, &attr, function, arg);
pthread_attr_destroy(&attr);




Mutex

再來就是mutex
加在mutex中間的code會逐一直行
不會同時並行

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&mutex1);
/*---------*/
pthread_mutex_unlock(&mutex1);

pthread_mutex_init(&mutex2, NULL);
pthread_mutex_destroy(&mutex2, NULL);


Semaphore 跟mutex很像
但是我還是不太清楚semaphore應該應用在什麼地方上

pthread portal