這裏是多線程,而不是多進程。我們用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不到這些函數
安裝manpages_posix-dev就可以了
sudo apt-get install manpages-posix-dev
舉個例子
當兩個線程是這樣的
void * work1()
{
printf("num 1\n");
sleep(1);
printf("num 2\n");
pthread_exit(NULL);
}
void * work2()
{
printf("num 3\n");
pthread_exit(NULL);
}
顯示的結果是
當加入互斥鎖後
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);
}
結果就變成這樣了
注意:這裏要兩個函數裏都用互斥鎖,如果只有一個用是不會鎖起來的
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);
}
貼上所有代碼
#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);