linux多線程程序

這裏是多線程,而不是多進程。我們用fork函數可以創建子進程,創建的子進程是和源程序完全一樣的,但是有自己的堆棧,代碼段,數據段,BSS端,而且當源進程關閉的時候,創建的新進程不會關閉,就相當於是複製出完全一樣的兩個程序在運行。

但是這裏的線程就不一樣了。它在源程序裏創建了一個新線程,這個線程不是源程序的完全複製,它和源程序共用同個資源,是源程序爲了提高效率讓多個線程同時執行某一項操作。

相關函數
創建線程   pthread_create
等待線程   pthread_join 
結束線程   pthread_exit

相關輔助函數(線程互斥鎖)
當多個線程對同一個公共資源進行操作時,就會碰到和多進程是一樣的問題,多個線程不能同時對同一個資源進行訪問操作,在進程間通信時用的是信號量來實現進程間互斥,這裏用線程互斥鎖。
初始化線程互斥鎖   pthread_mutex_init
獲取線程互斥鎖      pthread_mutex_lock
解開線程互斥鎖      pthread_mutex_unlock
用pthread_mutex_t mymutex,可以定義一個mymutex的互斥鎖,用pthread_mutex_init來初始化這個互斥鎖,pthread_mutex_lock和pthread_mutex_unlock分別爲加鎖和解鎖

如果man不到這些函數
linux多線程程序
安裝manpages_posix-dev就可以了
sudo apt-get install manpages-posix-dev
linux多線程程序

linux多線程程序


舉個例子
當兩個線程是這樣的
void * work1()
{
    printf("num 1\n");
    sleep(1);
    printf("num 2\n");
    
    pthread_exit(NULL);
}

void * work2()
{
    printf("num 3\n");
    
    pthread_exit(NULL);    
}
顯示的結果是
linux多線程程序

當加入互斥鎖後
void * work1()
{
    pthread_mutex_lock(&mut);
    printf("num 1\n");
    sleep(1);
    printf("num 2\n");
    pthread_mutex_unlock(&mut);
    
    pthread_exit(NULL);
}

void * work2()
{
    pthread_mutex_lock(&mut);
    printf("num 3\n");
    pthread_mutex_unlock(&mut);
    
    pthread_exit(NULL);    
}
結果就變成這樣了
linux多線程程序
注意:這裏要兩個函數裏都用互斥鎖,如果只有一個用是不會鎖起來的


void * work1()
{
    pthread_mutex_lock(&mut);
    printf("num 1\n");
    sleep(1);
    printf("num 2\n");
    pthread_mutex_unlock(&mut);
    
    sleep(2);
    
    pthread_mutex_lock(&mut);
    printf("num 4\n");
    pthread_mutex_unlock(&mut);
    
    pthread_exit(NULL);
}

void * work2()
{
    pthread_mutex_lock(&mut);
    printf("num 3\n");
    pthread_mutex_unlock(&mut);
    
    pthread_exit(NULL);    
}
linux多線程程序


貼上所有代碼
#include
#include

pthread_t thread[2];

int number = 0;
pthread_mutex_t mut;

void * work1()
{
    pthread_mutex_lock(&mut);
    printf("num 1\n");
    sleep(1);
    printf("num 2\n");
    pthread_mutex_unlock(&mut);
    
    sleep(2);
    
    pthread_mutex_lock(&mut);
    printf("num 4\n");
    pthread_mutex_unlock(&mut);
    
    pthread_exit(NULL);
}

void * work2()
{
    pthread_mutex_lock(&mut);
    printf("num 3\n");
    pthread_mutex_unlock(&mut);
    
    pthread_exit(NULL);    
}

void main()
{
    pthread_mutex_init(&mut, NULL);

    //創建工人1線程
    pthread_create(&thread[0], NULL, work1, NULL);
   
    //創建工人2線程
    pthread_create(&thread[1], NULL, work2, NULL);
   
    //等待工人1線程的結束
    pthread_join(thread[0], NULL);
   
    //等待工人2線程的結束
    pthread_join(thread[1], NULL);
}




多線程之間還可以用條件變量來減少等待線程對CPU的佔用

初始化

pthread_cond_t cond_ready = PTHREAD_COND_INITIALIZER;

等待條件成熟

pthread_cond_wait(&cond_ready, &mut);

設置條件成熟

pthread_cond_signal(&cond_ready);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章