多執行緒實現多工一

千鋒教育官方發表於2019-09-17

概述

每個程式都擁有自己的資料段、程式碼段和堆疊段,這就造成程式在進行建立、切換、撤銷操作時,需要較大的系統開銷。為了減少系統開銷,從程式中演化出了執行緒。為了讓程式完成一定的工作,程式必須至少包含一個執行緒。執行緒存在於程式中,共享程式的資源。

就像每個程式都有一個程式號一樣,每個執行緒也有一個執行緒號。程式號在整個系統中是唯一的,但執行緒號不同,執行緒號只在它所屬的程式環境中有效。程式號用 pid_t 資料型別表示,是一個非負整數。執行緒號則用 pthread_t 資料型別來表示,Linux 使用無符號長整數表示。有的系統在實現 pthread_t 的時候,用一個結構體來表示,所以在可移植的作業系統實現不能把它做為整數處理。

 

執行緒的常用函式

1)獲取執行緒號

所需標頭檔案:

#include <pthread.h>

pthread_t pthread_self(void) ;

功能:

獲取執行緒號。

引數:

返回值:

呼叫執行緒的執行緒 ID 。

 

2)執行緒號的比較

所需標頭檔案:

#include <pthread.h>

int pthread_equal(pthread_t t1, pthread_t t2);

功能:

判斷執行緒號 t1 和 t2 是否相等。為了方便移植,儘量使用函式來比較執行緒 ID。

引數:

t1,t2:待判斷的執行緒號。

返回值:

相等:  非 0

不相等:0

 

示例程式碼:

 

 

#include <stdio.h>  

#include <stdlib.h>  

#include <pthread.h>  

  

int main(int argc, char *argv[])  

{  

    pthread_t thread_id;  

  

    thread_id = pthread_self(); // 返回撥用執行緒的執行緒ID  

    printf("Thread ID = %lu \n",thread_id);  

  

    if( 0 != pthread_equal( thread_id, pthread_self() ) ){  

        printf("Equal!\n");  

    }else{  

        printf("Not equal!\n");  

    }  

      

    return 0;  

}  

 

執行緒函式的程式在 pthread 庫中,故連結時要加上引數 -lpthread。

執行結果如下:


3)執行緒的建立

 

所需標頭檔案:

 

#include <pthread.h>

int pthread_create( pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine)(void *),void *arg );

 

功能:

建立一個執行緒。

引數:

thread:執行緒識別符號地址。

attr:執行緒屬性結構體地址,通常設定為 NULL。

start_routine:執行緒函式的入口地址。

arg:傳給執行緒函式的引數。

返回值:

成功:0

失敗:非 0

pthread_create() 建立的執行緒從指定的回撥函式開始執行,該函式執行完後,該執行緒也就退出了。執行緒依賴程式存在的,共享程式的資源,如果建立執行緒的程式結束了,執行緒也就結束了。

 

示例一:

#include <stdio.h>  

#include <unistd.h>  

#include <pthread.h>  

  

int var  = 8;  

  

void *thread_1(void *arg)  

{  

    while(1)  

    {  

        printf("this is my new thread1: var++\n");  

        var++;  

        sleep(1);  

    }  

    return NULL;  

}  

  

void *thread_2(void * arg)  

{  

    while(1){  

        printf("this is my new thread2: var = %d\n", var);  

        sleep(1);  

    }  

      

    return NULL;  

}  

  

int main(int argc, char *argv[])  

{  

    pthread_t tid1,tid2;  

      

    //建立兩個執行緒  

    pthread_create(&tid1, NULL, thread_1, NULL);    

    pthread_create(&tid2, NULL, thread_2, NULL);  

      

    while(1){  

        printf("the main thread: var = %d\n", var);  

        sleep(1);  

    }  

      

    return 0;  

}  

 

執行結果如下:

示例二:

#include <stdio.h>  

#include <unistd.h>  

#include <pthread.h>  

  

// 回撥函式  

void *thread_fun(void * arg)  

{  

    sleep(1);  

    int num = *( (int *)arg );  

    printf("int the new thread: num = %d\n", num);  

      

    return NULL;  

}  

  

int main(int argc, char *argv[])  

{  

    pthread_t tid;  

    int test = 100;  

      

    // 建立執行緒, 把 &test 傳給回撥函式 thread_fun()  

    pthread_create(&tid, NULL, thread_fun, (void *)&test);    

  

    while(1);  

      

    return 0;  

}  

 

執行結果如下:

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69914734/viewspace-2657276/,如需轉載,請註明出處,否則將追究法律責任。

相關文章