Linux下C語言的多執行緒程式設計學習

2021-08-30 21:14:10 字數 4627 閱讀 6415

linux下c語言的多執行緒程式設計學習

一、首先,簡單了解一下多執行緒,從耳熟能詳的fork()、pthread中理點頭緒出來,然後自己寫乙個簡單的來增加一下信心。

1、linux系統下的多執行緒遵循posix執行緒介面,稱為pthread。編寫linux下的多執行緒程式,需要使用標頭檔案pthread.h,連 接時需要使用庫libpthread.a。因此,後面的編譯必須在選項中加入 -lpthread 選項,否則提示找不到pthread_create()這些函式。

2、pthread_t 是乙個執行緒的識別符號,建立執行緒用pthread_create(),等待執行緒結束用pthread_join(),這樣,差不多就可以開始寫第乙個簡單的多執行緒程式了,簡單得類似helloworld

下面的是我自己寫的乙個最簡單的程式。

#include #include void thread()  }

int main()

for (i=0;i<3;i++)

pthread_join(id,null);

return(0);

}

結果:

this is thread 0 .

this is thread 1 .

this is the main thread 0 .

this is the main thread 1 .

this is thread 2 .

this is the main thread 2 .

#######繫結輕程序#######

關於執行緒的繫結,牽涉到另外乙個概念:輕程序(lwp:light weight process)。 輕程序可以理解為核心執行緒,它位於使用者層和系統層之間。系統對執行緒資源的分配、對執行緒的控制是通過輕程序來實現的,乙個輕程序可以控制乙個或多個執行緒。默 認狀況下,啟動多少輕程序、哪些輕程序來控制哪些執行緒是由系統來控制的,這種狀況即稱為非繫結的。繫結狀況下,則顧名思義,即某個執行緒固定的"綁"在乙個 輕程序之上。被繫結的執行緒具有較高的響應速度,這是因為cpu時間片的排程是面向輕程序的,繫結的執行緒可以保證在需要的時候它總有乙個輕程序可用。通過設 置被繫結的輕程序的優先順序和排程級可以使得繫結的執行緒滿足諸如實時反應之類的要求。

不同的機器執行結果有可能不同,是由於兩個「並行」的執行緒搶奪處理器資源造成的。而sleep(i)是我自作聰明的想法,僅

僅是為了讓結果看上去更加能體現兩個執行緒是「並行」執行的,其實完全可以省去。

預設的屬性:非繫結、非分離、預設1m的堆疊、與父程序同樣級別的優先順序。

#include pthread_attr_t attr;

pthread_t tid;

/*初始化屬性值,均設為預設值*/

pthread_attr_init(&attr);

pthread_attr_setscope(&attr, pthread_scope_system);

/*pthread_scope_system(繫結的) pthread_scope_process(非繫結的)*/

pthread_create(&tid, &attr, (void *) my_function, null);

######設定分離狀態######

執行緒的分離狀態決定乙個執行緒以什麼樣的方式來終止自己。執行緒的預設屬性下,即為非分離狀態,這種情況下,原有的執行緒等待建立的執行緒結束。只有當 pthread_join()函式返回時,建立的執行緒才算終止,才能釋放自己占用的系統資源。而分離執行緒不是這樣子的,它沒有被其他的執行緒所等待,自己運 行結束了,執行緒也就終止了,馬上釋放系統資源。程式設計師應該根據自己的需要,選擇適當的分離狀態。設定執行緒分離狀態的函式為 pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)。第二個引數可選為pthread_create_detached(分離執行緒)和 pthread _create_joinable(非分離執行緒)。這裡要注意的一點是,如果設定乙個執行緒為分離執行緒,而這個執行緒執行又非常快,它很可能在 pthread_create函式返回之前就終止了,它終止以後就可能將執行緒號和系統資源移交給其他的執行緒使用,這樣呼叫pthread_create的 執行緒就得到了錯誤的執行緒號。要避免這種情況可以採取一定的同步措施,最簡單的方法之一是可以在被建立的執行緒裡呼叫 pthread_cond_timewait函式,讓這個執行緒等待一會兒,留出足夠的時間讓函式pthread_create返回。設定一段等待時間,是 在多執行緒程式設計裡常用的方法。但是注意不要使用諸如wait()之類的函式,它們是使整個程序睡眠,並不能解決執行緒同步的問題。

#######設定優先順序#######

另外乙個可能常用的屬性是執行緒的優先順序,它存放在結構sched_param中。用函式pthread_attr_getschedparam 和函式pthread_attr_setschedparam進行存放,一般說來,我們總是先取優先順序,對取得的值修改後再存放回去。下面即是一段簡單的 例子。

#include #include pthread_attr_t attr;

pthread_t tid;

sched_param param;

int newprio=20;

pthread_attr_init(&attr);

pthread_attr_getschedparam(&attr, ¶m);

param.sched_priority=newprio;

pthread_attr_setschedparam(&attr, ¶m);

pthread_create(&tid, &attr, (void *)myfunction, myarg);

about mutex

mutex是乙個互斥鎖物件,互斥鎖是為了防止多執行緒同時修改某一公共資源,我在下面的程式裡把它「鎖」在了乙個叫buffer[10]的緩衝區 上,模型是2個reader和2個writer,reader要等到叫buffer的書架上有書的時候才可以read,而writer也必須在書架沒有放 滿的情況下才可以把新寫的書放到書架上。我的程式裡書架的大小是1,當然也可以設定書架的大小,不過實現過程大同小異。就不多說了。來看程式:

#include #include void reader_function(void);

void writer_function(void);

char buffer[10]=;

int buffer_has_item=0;

pthread_mutex_t mutex;

int main(void)

void writer_function(void)

/* 開啟互斥鎖*/

printf("writer %d unlocked buffer.\r\n\n\n",ti);

pthread_mutex_unlock(&mutex);

sleep(1);

} }

void reader_function(void)

printf("reader %d unlocked buffer.\r\n\n\n",ti);

pthread_mutex_unlock(&mutex);

sleep(1);

}}

結果:

reader 1 locked buffer.

reader 1 unlocked buffer.

writer 1 locked buffer.

++writer 1 fill the buffer with context "full".

writer 1 unlocked buffer.

writer 2 locked buffer.

writer 2 unlocked buffer.

reader 1 locked buffer.

--reader 1 clean the buffer with context "empty".

reader 1 unlocked buffer.

writer 2 locked buffer.

++writer 2 fill the buffer with context "full".

writer 2 unlocked buffer.

reader 2 locked buffer.

--reader 2 clean the buffer with context "empty".

reader 2 unlocked buffer.

注意,這次用到的sleep()不再是為了讓結果好看, 而是為了防止乙個執行緒始終占用資源,很多網上的教程使用的是pthread_delay_np(&delay);這個語句,不過這個似乎只能在 solaris系統上用,linux還是用sleep()和usleep()好了,有高人說可能會使該執行緒所在的程序都sleep,我使用下來似乎沒有發 現。而且似乎linux下本來就是乙個程序裡只有乙個執行緒,忘記哪個手冊上說的,也許是以前的版本,不追究了,能用就行。

還 有就是在reader()和writer()裡,我用了很奇怪的 i 和 ti 兩個變數來對reader和writer編號,主要目的是為了保證每個reader和writer都能完成自己的使命,如果按照常規寫法,使用for(i =1;i<3;i++)這樣控制迴圈會使有的reader或者writer不能取到或者放上書。似乎說得自己都迷糊了,舉例說,reader1去取 書,恰巧這時候書架上是空的,為了保證reader1能取到書,我就讓reader們排隊,直到reader1取到以後才輪到reader2,對於 writer們也實行排隊.

**:

linux下C語言多執行緒程式設計

include include include include define max 10pthread t thread 2 pthread mutex t mut int number 0 i void thread1 printf thread1 主函式在等我完成任務嗎?n pthread e...

多執行緒程式設計 c語言linux下

適用與linux系統 1.了解基本概念 程序 是計算機所執行的乙個任務的描述,是面向作業系統的最小單位,作業系統能執行很多程序 執行自己寫的乙份 程式,就是讓作業系統執行乙個自己程式的程序 作業系統會根據程式分配定量的資源 執行緒 面想程式 程序 的,把乙個程式分成多個執行緒可以實現並髮式,多工執行...

linux 下c語言 多執行緒程式設計

最近學習c語言和linux,記錄一下linux中線程的簡單使用 linux執行緒一般用pthread庫建立。pthread是 posix thread的簡稱。在linux的 lib目錄下,可以找到名為libpthread x.x.so x.x是版本號 的庫。下面模擬兩個執行緒 threaddemo....