程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> pthread 簡要使用指南(一) pthread_create

pthread 簡要使用指南(一) pthread_create

編輯:C++入門知識

POSIX thread 簡稱為pthread,Posix線程是一個POSIX標准線程。該標准定義內部API創建和操縱線程。 Pthreads定義了一套 C程序語言類型、函數與常量,它以 pthread.h 頭文件和一個線程庫實現。
     直接上代碼,簡單明了。

 

[cpp]
 #include <pthread.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 
 
// 線程ID 
pthread_t       ntid; 
// 互斥對象 
pthread_mutex_t mutex; 
 
int             count; 
 
void printids(const char *s) 

    pid_t   pid; 
    pthread_t   tid; 
 
    pid = getpid(); 
    tid = pthread_self(); 
 
    printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int)pid, 
        (unsigned int)tid, (unsigned int)tid); 

 
// 線程函數 
void *thr_fn(void *arg) 

    printids("new thread begin\n"); 
 
    // 加鎖 
    pthread_mutex_lock(&mutex); 
 
    printids("new thread:"); 
 
    int i=0; 
    for ( ; i < 5; ++i ) 
    { 
        printf("thr_fn runing %d\n", count++); 
    } 
 
    // 釋放互斥鎖 
    pthread_mutex_unlock(&mutex); 
 
    return ( (void*)100); 

 
int main(void) 

    int err; 
 
    count = 0; 
    // 初始化互斥對象 
    pthread_mutex_init(&mutex, NULL); 
 
    // 創建線程 
    err = pthread_create(&ntid, NULL, thr_fn, NULL); 
    if ( 0 != err ) 
    { 
        printf("can't create thread:%s\n", strerror(err)); 
    } 
 
    // sleep(5); 
    pthread_mutex_lock(&mutex);   
    printids("main thread:"); 
    int i=0; 
    for ( ; i < 5; ++i ) 
    { 
        printf("main runing %d \n", count++); 
    } 
    sleep(1); 
    pthread_mutex_unlock(&mutex); 
 
    int **ret; 
    pthread_join(ntid, (void**)ret); 
    printf("thr_fn return %d\n", *ret); 
 
    pthread_mutex_destroy(&mutex); 
 
 
    return 0; 

 

     
    這個例子,用到了pthread的數據結構:
    pthread_t,  這個結構來標識線程ID;
    pthread_mutex_t, 這個用來做互斥;


    用到了如下函數:
    pthread_self() :  獲得線程自身的ID;

    pthread_create(&ntid, NULL, thr_fn, NULL): 線程創建函數
    原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void*(*start_routine)(void*),  void *arg)。
    tid : 新創建線程的線程ID;
    attr: 指定新創建線程的線程屬性,為NULL即為使用默認屬性;
    start_routine : 這是一個函數指針,用來指向線程函數;
    arg : 傳遞給線程函數的指針;   
    返回值 : 0代表成功。 失敗,返回的則是錯誤號。

    pthread_join(ntid, (void*)ret):等待一個線程的結束  
    原型:int pthread_join(pthread_t thread, void **retval);
    thread : 需要等待的線程的ID;
    retval : 存放等待線程的返回值;
    返回值 : 0代表成功。 失敗,返回的則是錯誤號。
   
    pthread_mutex_init(&mutex, NULL):初始化互斥鎖,以動態方式創建互斥鎖
    原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex,
              const pthread_mutexattr_t *restrict attr);
    mutex : 被初始化的鎖對象; www.2cto.com
    attr  : 指定新建互斥鎖的屬性。為NULL,則使用默認的互斥鎖屬性,默認屬性為快速互斥鎖。

    pthread_mutex_lock(&mutex)     : 加鎖
    pthread_mutex_unlock(&mutex) : 釋放鎖

    pthread_mutex_destroy(&mutex): 銷毀鎖對象
   
   
    編譯的時候,需要加上編譯參數“-lpthread”。
    可以屏蔽pthread_mutex_lock(),pthread_mutex_unlock()看下沒有互斥的結果。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved