執行緒pthread相關
與執行緒pthread相關:
一、POSIX 多執行緒程式設計:https://blog.csdn.net/future_fighter/article/details/3865071#pthreads_overvie
Pthreads API中的函式可以非正式的劃分為三大類:
(1)執行緒管理(Thread management): 第一類函式直接用於執行緒:建立(creating),分離(detaching),連線(joining)等等。包含了用於設定和查詢執行緒屬性(可連線,排程屬性等)的函式。
(2)互斥量(Mutexes): 第二類函式是用於執行緒同步的,稱為互斥量(mutexes),是"mutual exclusion"的縮寫。Mutex函式提供了建立,銷燬,鎖定和解鎖互斥量的功能。同時還包括了一些用於設定或修改互斥量屬性的函式。
例程如下:
用四個執行緒計算a[i]*b[i]積的和dotstr.sum,四個執行緒分別計算 i的取值為 i =[0...99], [100...199], [200...299], [300...399]
#include <pthread.h> #include <stdio.h> #include <malloc.h> #include <iostream> using namespace std; typedef struct { double *a; double *b; double sum; int veclen; } DOTDATA; #define NUMTHRDS 4 #define VECLEN 10 DOTDATA dotstr; pthread_t callThd[NUMTHRDS]; pthread_mutex_t mutexsum; void *dotprod(void *arg) { int i, start, end, len ; long offset; double mysum, *x, *y; offset = (long)arg; len = dotstr.veclen; start = offset*len; end = start + len; x = dotstr.a; y = dotstr.b; mysum = 0; for (i=start; i<end ; i++) { mysum += (x[i] * y[i]); } pthread_mutex_lock (&mutexsum); dotstr.sum += mysum; cout << "dotstr.sum = " << dotstr.sum << endl; pthread_mutex_unlock (&mutexsum); pthread_exit((void*) 0); } int main (int argc, char *argv[]) { long i; double *a, *b; void *status; pthread_attr_t attr; /* Assign storage and initialize values */ a = (double*) malloc (NUMTHRDS*VECLEN*sizeof(double)); b = (double*) malloc (NUMTHRDS*VECLEN*sizeof(double)); for (i=0; i<VECLEN*NUMTHRDS; i++) { a[i]=1.0; b[i]=a[i]; } dotstr.veclen = VECLEN; dotstr.a = a; dotstr.b = b; dotstr.sum=0; pthread_mutex_init(&mutexsum, NULL); /* Create threads to perform the dotproduct */ pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); for(i=0; i<NUMTHRDS; i++) { pthread_create( &callThd[i], &attr, dotprod, (void *)i); } pthread_attr_destroy(&attr); /* Wait on the other threads */ for(i=0; i<NUMTHRDS; i++) { pthread_join( callThd[i], &status); } /* After joining, print out the results and cleanup */ printf ("Sum = %f /n", dotstr.sum); free (a); free (b); pthread_mutex_destroy(&mutexsum); pthread_exit(NULL); }
(3)條件變數(Condition variables):第三類函式處理共享一個互斥量的執行緒間的通訊,基於程式設計師指定的條件。這類函式包括指定的條件變數的建立,銷燬,等待和受信(signal)。設定查詢條件變數屬性的函式也包含其中。
二、參考https://blog.csdn.net/hyp1977/article/details/51505744
所有的執行緒都是平級的,根本不存在主執行緒和子執行緒。下文所述為了方便,將在main函式中的執行緒看做主執行緒,其它執行緒看成子執行緒,特此說明。先考慮以下程式碼:
#include <pthread.h> #include <stdio.h> #include <unistd.h> void* thrd_start_routine(void* v) { sleep(10); printf("created thread\n"); } int main() { pthread_t thrdid; pthread_create(&thrdid, NULL, &thrd_start_routine, NULL); sleep(5); printf("main thread\n"); return 0; }
執行,結果是5s休眠後,列印“main thread";程式退出
之前誤認為執行緒和程序一樣,主執行緒退出,子執行緒退出。再考慮以下程式碼:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void* thrd_start_routine(void* v)
{
sleep(10);
printf("created thread\n");
}
int main()
{ pthread_t thrdid;
pthread_create(&thrdid, NULL, &thrd_start_routine, NULL);
sleep(5);
printf("main thread\n");
pthread_exit(NULL);
printf("main exit\n");
return 0;
}
結果輸出 main thread ;5s後輸出 created thread;注意u,此處的main exit並不輸出
相較於上一個程式,只加了一句 pthread_exit(NULL);
原因:
之前一個程式是在列印主執行緒之後,程式return,間接呼叫了exit()函式,因為一個執行緒呼叫exit函式,導致整個程序的退出,系統回收所有的資源,當然所有 的執行緒都退出了。
在主執行緒退出時,要想系統並不回收程序的所有資源,可以呼叫pthread_exit();然後等其他執行緒終止退出。
|