1. 程式人生 > >執行緒pthread相關

執行緒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();然後等其他執行緒終止退出。