我們知道Linux操作系統(tǒng)中檬贰,不同的進(jìn)程是并行運(yùn)行的。每個(gè)進(jìn)程都擁有自己獨(dú)立的虛擬內(nèi)存空間,好像整個(gè)系統(tǒng)都由自己獨(dú)占的一樣。
一個(gè)進(jìn)程內(nèi)部严沥,還可以擁有多個(gè)并行運(yùn)行的代碼片斷蛛勉,被稱之為線程(thread)剔桨。線程隸屬于進(jìn)程限匣,父子關(guān)系。同一進(jìn)程內(nèi)部的線程共享同一虛擬內(nèi)存空間历极,所以啟動(dòng)或終止一個(gè)線程窄瘟,比啟動(dòng)和終止一個(gè)進(jìn)程要快,而且需要的系統(tǒng)資源少趟卸。我們稱之為輕量級(jí)的并行解決方案蹄葱。
線程的編程方法是,定義一個(gè)函數(shù)和其參數(shù)锄列,然后用 pthread_create() 啟動(dòng)一個(gè)線程并執(zhí)行這個(gè)函數(shù)图云。
#include <stdio.h> //printf
#include <unistd.h> //sleep
#include <pthread.h> //pthread_xxx
void *thread_func(void *p)
{
long i = (long)p;
for (int j = 0; j < 5; j++)
{
printf("--- %d\n", i);
}
return NULL;
}
int main()
{
pthread_t t1, t2;
pthread_create(&t1, 0, thread_func, (void *)1);
pthread_create(&t2, 0, thread_func, (void *)2);
sleep(3);
return 0;
}
# gcc pthread-create.c -lpthread -o pthread-create && ./pthread-create
--- 2
--- 2
--- 2
--- 2
--- 2
--- 1
--- 1
--- 1
--- 1
--- 1
線程間同步
在主線程中使用 pthread_join() 來等待其他線程結(jié)束。
# cat pthread-sync.c
#include <stdio.h> //printf
#include <pthread.h> //pthread_xxx
void *thread_func(void *p)
{
long i = (long)p;
for (int j = 0; j < 5; j++)
{
printf("--- %d\n", i);
}
return NULL;
}
int main()
{
pthread_t t1, t2;
pthread_create(&t1, 0, thread_func, (void *)1);
pthread_create(&t2, 0, thread_func, (void *)2);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
return 0;
}
# gcc pthread-create.c -lpthread -o pthread-create && ./pthread-create
--- 2
--- 2
--- 2
--- 2
--- 2
--- 1
--- 1
--- 1
--- 1
--- 1
參考
http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html