下面的code是pthread模板
大部分簡單的平行化都可以解決 小細節的話再從模板中慢慢加進去
#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;
}
- thread_array1是static參數 需要事先給值
- thread_array2是dynamic參數 可以等程式執行到之後再給值
//
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);
//
thread_array1
pthread_t thread_array1[thread_num];
// 開始平行化
attr 屬性 有兩種
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);Mutex
再來就是mutex