導航:首頁 > 編程系統 > linux線程和相關函數

linux線程和相關函數

發布時間:2022-07-06 10:34:20

⑴ 用linux,pthread相關函數創建一個調度策略為NORMAL,priority=15的線程,

主要()程序來創建一個新的線程:
(空)線程;
pthread_t ID2
的主要(){

RET =調用的pthread_create(&ID NULL,(void *)的版線程,NULL);
(ret! = 0)
{
printf的(「創建權pthread的錯誤!\ n」);
出口(1 );
}
/ /第二個線程
RET =調用的pthread_create(ID2,NULL,(void *)的線程,NULL);
(ret! = 0) /> {
輸出(「創建pthread2錯誤!\ n」);
出口(1);
}

}

你最多能夠創造1,024線程

⑵ Linux 多線程問題: 怎麼在創建線程後,設置線程的優先順序及其他參數,有沒有相關的函數。

linux並不是實時操作系統,把下面的代碼運行一遍就能夠理解了,代碼有很專詳細的注釋屬。

http://blog.csdn.net/lanseshenhua/article/details/5524797

⑶ linux下線程屬性常用操作有哪些

LinuxThread的線程機制

LinuxThreads是目前平台上使用最為廣泛的線程庫,由Xavier Leroy ([email protected]) 負責開發完成,並已綁定在GLIBC中發行。它所實現的就是基於核心輕量級進程的"一對一"線程模型,一個線程實體對應一個核心輕量級進程,而線程之間的 管理在核外函數庫中實現。

1.線程描述數據結構及實現限制

LinuxThreads定義了一個struct _pthread_descr_struct數據結構來描述線程,並使用全局數組變數 __pthread_handles來描述和引用進程所轄線程。在__pthread_handles中的前兩項,LinuxThreads定義了兩個全 局的系統線程:__pthread_initial_thread和__pthread_manager_thread,並用 __pthread_main_thread表徵__pthread_manager_thread的父線程(初始為 __pthread_initial_thread)。

struct _pthread_descr_struct是一個雙環鏈表結構,__pthread_manager_thread所在的鏈表僅包括它 一個元素,實際上,__pthread_manager_thread是一個特殊線程,LinuxThreads僅使用了其中的errno、p_pid、 p_priority等三個域。而__pthread_main_thread所在的鏈則將進程中所有用戶線程串在了一起。經過一系列 pthread_create()之後形成的__pthread_handles數組將如下圖所示:

圖2 __pthread_handles數組結構

新創建的線程將首先在__pthread_handles數組中占據一項,然後通過數據結構中的鏈指針連入以__pthread_main_thread為首指針的鏈表中。這個鏈表的使用在介紹線程的創建和釋放的時候將提到。

LinuxThreads遵循POSIX1003.1c標准,其中對線程庫的實現進行了一些范圍限制,比如進程最大線程數,線程私有數據區大小等等。在 LinuxThreads的實現中,基本遵循這些限制,但也進行了一定的改動,改動的趨勢是放鬆或者說擴大這些限制,使編程更加方便。這些限定宏主要集中 在sysdeps/unix/sysv/linux/bits/local_lim.h(不同平台使用的文件位置不同)中,包括如下幾個:

每進程的私有數據key數,POSIX定義_POSIX_THREAD_KEYS_MAX為128,LinuxThreads使用 PTHREAD_KEYS_MAX,1024;私有數據釋放時允許執行的操作數,LinuxThreads與POSIX一致,定義 PTHREAD_DESTRUCTOR_ITERATIONS為4;每進程的線程數,POSIX定義為64,LinuxThreads增大到1024 (PTHREAD_THREADS_MAX);線程運行棧最小空間大小,POSIX未指定,LinuxThreads使用 PTHREAD_STACK_MIN,16384(位元組)。

2.管理線程

"一對一"模型的好處之一是線程的調度由核心完成了,而其他諸如線程取消、線程間的同步等工作,都是在核外線程庫中完成的。在LinuxThreads 中,專門為每一個進程構造了一個管理線程,負責處理線程相關的管理工作。當進程第一次調用pthread_create()創建一個線程的時候就會創建 (__clone())並啟動管理線程。

在一個進程空間內,管理線程與其他線程之間通過一對"管理管道(manager_pipe[2])"來通訊,該管道在創建管理線程之前創建,在成功啟動 了管理線程之後,管理管道的讀端和寫端分別賦給兩個全局變數__pthread_manager_reader和 __pthread_manager_request,之後,每個用戶線程都通過__pthread_manager_request向管理線程發請求, 但管理線程本身並沒有直接使用__pthread_manager_reader,管道的讀端(manager_pipe[0])是作為__clone ()的參數之一傳給管理線程的,管理線程的工作主要就是監聽管道讀端,並對從中取出的請求作出反應。

創建管理線程的流程如下所示:
(全局變數pthread_manager_request初值為-1)

圖3 創建管理線程的流程

初始化結束後,在__pthread_manager_thread中記錄了輕量級進程號以及核外分配和管理的線程id, 2*PTHREAD_THREADS_MAX+1這個數值不會與任何常規用戶線程id沖突。管理線程作為pthread_create()的調用者線程的 子線程運行,而pthread_create()所創建的那個用戶線程則是由管理線程來調用clone()創建,因此實際上是管理線程的子線程。(此處子 線程的概念應該當作子進程來理解。)

__pthread_manager()就是管理線程的主循環所在,在進行一系列初始化工作後,進入while(1)循環。在循環中,線程以2秒為 timeout查詢(__poll())管理管道的讀端。在處理請求前,檢查其父線程(也就是創建manager的主線程)是否已退出,如果已退出就退出 整個進程。如果有退出的子線程需要清理,則調用pthread_reap_children()清理。

然後才是讀取管道中的請求,根據請求類型執行相應操作(switch-case)。具體的請求處理,源碼中比較清楚,這里就不贅述了。

3.線程棧

在LinuxThreads中,管理線程的棧和用戶線程的棧是分離的,管理線程在進程堆中通過malloc()分配一個THREAD_MANAGER_STACK_SIZE位元組的區域作為自己的運行棧。

用戶線程的棧分配辦法隨著體系結構的不同而不同,主要根據兩個宏定義來區分,一個是NEED_SEPARATE_REGISTER_STACK,這個屬 性僅在IA64平台上使用;另一個是FLOATING_STACK宏,在i386等少數平台上使用,此時用戶線程棧由系統決定具體位置並提供保護。與此同 時,用戶還可以通過線程屬性結構來指定使用用戶自定義的棧。因篇幅所限,這里只能分析i386平台所使用的兩種棧組織方式:FLOATING_STACK 方式和用戶自定義方式。

在FLOATING_STACK方式下,LinuxThreads利用mmap()從內核空間中分配8MB空間(i386系統預設的最大棧空間大小,如 果有運行限制(rlimit),則按照運行限制設置),使用mprotect()設置其中第一頁為非訪問區。該8M空間的功能分配如下圖:

圖4 棧結構示意

低地址被保護的頁面用來監測棧溢出。

對於用戶指定的棧,在按照指針對界後,設置線程棧頂,並計算出棧底,不做保護,正確性由用戶自己保證。

不論哪種組織方式,線程描述結構總是位於棧頂緊鄰堆棧的位置。

4.線程id和進程id

每個LinuxThreads線程都同時具有線程id和進程id,其中進程id就是內核所維護的進程號,而線程id則由LinuxThreads分配和維護。

⑷ 如何去理解Linux中進程,線程等概念

對於linux來說,則沒有很明確的進程、線程概念。首先linux只有進程而沒有線程,然而它的進程又可以表現得像windows下的線程。linux利用fork()和exec函數族來操作多線程。fork()函數可以在進程執行的任何階段被調用,一旦調用,當前進程就被分叉成兩個進程——父進程和子進程,兩者擁有相同的代碼段和暫時相同的數據段(雖然暫時相同,但從分叉開的時刻就是邏輯上的兩個數據段了,之所以說是邏輯上的,是因為這里是「寫時復制」機制,也就是,除非萬不得已有一個進程對數據段進行了寫操作,否則系統不去復制數據段,這樣達到了負擔最小),兩者的區別在於fork()函數返回值,對於子進程來說返回為0,對於父進程來說返回的是子進程id,因此可以通過if(fork()==0)…else…來讓父子進程執行不同的代碼段,從而實現「分叉」。
exec函數族的函數的作用則是啟動另一個程序的新進程,然後完全用那個進程來代替自己(代碼段被替換,數據段和堆棧被廢棄,只保留原有進程id)。這樣,如果在fork()之後,在子進程代碼段里用exec啟動另一個進程,就相當於windows下的CreateThread()的用處了,所以說linux下的進程可以表現得像windows下的線程。
然而linux下的進程不能像windows下線程那樣方便地通信,因為他們沒有共享數據段、地址空間等。它們之間的通信是通過所謂IPC(InterProcess Communication)來進行的。具體有管道(無名管道用於父子進程間通信,命名管道可以用於任意兩個進程間的通信)、共享內存(一個進程向系統申請一塊可以被共享的內存,其它進程通過標識符取得這塊內存,並將其連接到自己的地址空間中,效果上類似於windows下的多線程間的共享數據段),信號量,套接字。
標簽: 進程, 線程

⑸ 關於linux下GCC編寫關於線程的函數

直接if(threads[i]),和if(threads[i]!=NULL)是等效的。
可以檢驗thread[i]是不是存在。
因為我不知道你 (threads[i]!=0 )這句話是想為了干什麼,所以只能這么猜測。
要不然這句話沒有意義。

⑹ linux線程pthread_cleanuo_push 函數問題

pthread_cleanup_push來注冊清理函數rtn,這個函數有一個參數arg。在以下三種情形之一發生時,注冊的清理函數被執行:
1)調用pthread_exit。
2)作為對取消線程請求(pthread_cancel)的響應。
3)以非0參數調用pthread_cleanup_pop。
注意:
1)如果線程只是由於簡單的返回而終止的,則清除函數不會被調用。
2)如果pthread_cleanup_pop被傳遞0參數,則清除函數不會被調用,但是會清除處於棧頂的清理函數。

⑺ 有人能教下我有關linux裡面線程的知識嗎

.線程的基本介紹
(1)線程的概述
線程與進程類似,也允許應用程序並發執行多個任務的一種機制。一個進程可以包含多個線程,同一程序中的所有線程共享同一份全局內存區域,線程之間沒有真正意義的等級之分。同一個進程中的線程可以並發執行,如果處理器是多核的話線程也可以並行執行,如果一個線程因為等待I/O操作而阻塞,那麼其他線程依然可以繼續運行
(2)線程優於進程的方面

argv,environ

主線程棧
線程3的棧
線程2的棧
線程1的棧
共享函數庫共享的內存

未初始化的數據段
初始化數據段
文本
.進程間的信息難以共享。由於除去只讀代碼段外,父子進程並未共享內存,因此必須採用一些進程間通訊,在進程之間交換信息
.調用fork()來創建進程代價相對較高
線程很好的解決了上述倆個問題
.線程之間能夠方便,快速的共享信息,只需將數據復制到共享(全局或堆)變數中即可
.創建線程比創建線程通常要快10甚至更多,線程創建之所以快,是因為fork創建進程時所需復制多個屬性,而在線程中,這些屬性是共享的。
(3)創建線程
啟動程序時,產生的進程只有單條線程,我們稱之為主線程
#include<pthread.h>
int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void*(*start)(void *),void *arg);12

新線程通過調用帶有arg的函數開始執行,調用pthread_create()的線程會繼續執行該調用之後的語句。
(4)終止線程
可以以如下方式終止線程的運行
.線程調用pthread_exit()
.線程start函數執行return語句並返回指定值
.調用pthread_cancel()取消線程
.任意線程調用了exit(),或者主線程執行了return語句,都會導致進程中的所有線程立即終止
pthread_exit()函數可以終止線程,且其返回值可由另一線程通過調用pthread_join()獲得
#include<pthread.h>void pthread_exit(void *retval);12

調用pthread_exit()相當於在線程的start函數中執行return,不同之處在於,pthread_exit()可以在任何地方調用,參數retval指定了線程的返回值
(5)獲取線程ID
#include<pthread.h>pthread_t pthread_self(void);12

線程ID在應用程序中主要有如下用途
.不同的pthreads函數利用線程ID來標識要操作目標線程。
.在具體的應用程序中,以特定線程的線程ID作為動態數據結構的標簽,這頗有用處,既可用來識別某個數據結構的創建者或屬主線程,又可確定隨後對該數據結構執行操作的具體線程
函數pthread_equal()可檢查倆個線程的ID是否相同
#include<pthread.h>int pthread_equal(pthread_t t1,pthread_t t2);//如果相同返回非0值,否則返回0123

(6)連接已終止的線程
函數pthread_join()等待由thread表識的線程終止
#include<pthread.h>int pthread_join(pthread_t thread,void **retval);//返回0調用成功,否則失敗123

如果pthread_join()傳入一個之前已然連接過的線程ID,將會導致無法預知的行為,當相同線程ID在參與一次連接後恰好為另一新建線程所重用,再度連接的可能就是這個新線程
若線程未分離,則就應該使用pthread_join()來連接線程,否則會產生僵屍線程
pthrea_join()函數的要點
.線程之間的關系是對等的,所以任意線程都可以調用pthread_join()來連接其他線程
.pthread_join()無法針對任意線程,只能連接單個線程
(6)線程的分離
默認情況下線程都是可連接的,但有時候,我們並不關心線程退出的狀態,我們可以調用pthread_detach()並向thread參數傳入指定線程的的標識符,將該線程標記為處於分離狀態
#include<pthread.h>int pthread_detach(pthread_t thread);//返回0成功,否則失敗123

一旦線程處於分離狀態,就不能在使用pthread_join()來獲取其狀態,也無法使其重返可連接狀態
(7)在應用程序中如何來選擇進程還是線程
.線程之間共享數據很簡單,進程間的數據共享需要更多的投入
.創建線程要比創建進程塊很多
.多線程編程時,需要確保調用線程安全的函數
.某個線程中的bug可能會危害進程中所有線程
.每個線程都在徵用宿主進程中有限的虛擬地址空間
.在多線程應用中,需要小心使用信號
.除了數據,線程還可以共享文件描述符,信號處置,當前工作目錄,以及用戶ID和組ID
線程的同步
(1)保護共享變數訪問:互斥量
線程的主要優勢在於能夠通過全局變數來共享信息,不過這種共享是有代價的。必須確保多個線程修改同一變數時,不會有其他線程也正在修改此變數,為避免線程更新時共享變數時所出現的問題,必須使用互斥量來確保同時僅有一個線程可以訪問某項共享資源
(2)靜態分配的互斥鎖
互斥鎖既可以像靜態變數那樣分配,也可以在運行時動態分配,互斥量屬於pthread_mutex_t類型的變數,在使用之前必須對其初始化。對於靜態分配的互斥量而言,可如下例所示,將PTHREAD_MUTEX_INITIALIZER賦給互斥量
pthread_mutex_t = PTHREAD_MUTEX_INITIALIZER;1

1.加鎖和解鎖互斥量
初始化之後,互斥量處於未鎖定狀態。函數pthread_mutex_lock()可以鎖定某一互斥量
而函數pthread_mutex_unlock()則可以將一個互斥量解鎖
#include<pthread.h>int pthread_mutex_lock(pthread_mutex_t *mutex);int pthread_mutex_unlock(pthread_mutex_t *mutex);//返回0成功,其他失敗1234

要鎖定互斥量,在調用pthread_mutex_lock()時需要指定互斥量,如果互斥量當前處於未鎖定狀態,則該調用將會立即返回,如果該互斥量已被其他線程鎖定,那麼該調用將會阻塞,直至互斥量被解鎖
函數pthread_mutex_unlock()將解鎖之前已遭調用線程鎖定的互斥量
2.互斥量的性能
通常情況下,線程會花費更多的時間去做其他工作,對互斥量的加鎖解鎖相對要少的多,因此使用互斥量對大部分程序來說性能並無顯著的影響
3.互斥量的死鎖
當一個線程需要同時訪問多個共享資源時,沒個資源由不同的互斥索管理。當超過一個線程加鎖同一組互斥量時,就有可能發生死鎖。如下圖所示
線程A
1.pthread_mutex_lock(mutex1);
2.pthread_mutex_lock(mutex2);
線程2
1.pthread_mutex_lock(mutex2);
2.pthread_mutex_lock(mutex1);
每個線程都成功的鎖住一個互斥量,接著試圖對以為另一線程鎖定的互斥量加鎖,就會一直等下去
要避免此類死鎖問題,最簡單的就是定義互斥量的層級關系

⑻ linux下C語中用到的線程編程函數

這個網上一搜就能搜出來不少.

線程基本函數:
http://blog.csdn.net/yuzhoudiwang/archive/2009/07/25/4379735.aspx

線程鎖函數:
http://doc.chinaunix.net/linux/201006/633080.shtml

條件變數(pthread_cond系列)函數:
http://hi..com/ganss/blog/item/30294fb3fb1a4da5d9335add.html

⑼ 關於在linux系統下線程函數的問題

當然是系統給抄你分配的...

實際上,這個id應該看作輸出參數,而不是輸入參數,因為你傳遞的是一個地址,它分配完了線程的id再把這個值填到你給的地址..是系統API給你傳遞了值

這個id肯定不能是你指定的,就好比fork出來的進程一樣...這個資源是系統給你分配的..系統會保證是這個值不和其他的進程或者線程的id重復的...還有open之後給你一個fd,這個東西也是一樣,需要保證不能重復...

如果你不打算對這個線程\進程進行控制,那麼他的id你都不需要知道...也能正常運行....

⑽ 求教Linux多個線程 可不可以同時調用一個函數

使用pthread庫執行多線程,這個是Linux下的線程庫 Windows下應該有自己的API,不過這種東西一般還是以Linux為標准。pthread_create()創建一個線程,傳入fun()的函數指針就行了。 然後這個Beep()的需求要進行線程間通信,可以用共享內存的方法,...

閱讀全文

與linux線程和相關函數相關的資料

熱點內容
win10怎麼把文件改成vbs文件路徑 瀏覽:923
南城免費的進出口數據平台哪個好 瀏覽:950
周星馳電影下載文件 瀏覽:600
qq頭像掛件絕版代碼 瀏覽:604
帶點黃色的都市小說 瀏覽:725
java配置文件參數 瀏覽:257
買足球鞋用什麼網站 瀏覽:107
粵語電影迅雷下載 瀏覽:786
怎麼導入文件夾進u盤 瀏覽:732
stm8s103源程序 瀏覽:441
我能復制天賦葉天小說免費閱讀 瀏覽:49
經典南洋建國類小說 瀏覽:650
遺願清單app 瀏覽:419
溫州ug數控編程培訓哪個學校好 瀏覽:98
360收藏的網站不見了如何找回 瀏覽:457
電影39天完整版 瀏覽:902
星空衛視播放的日本恐怖片 瀏覽:494
手機重置後wlan怎麼添加網路名稱 瀏覽:608
谷歌商店下載舊版本 瀏覽:392
我老公的家庭教育師韓劇演員表 瀏覽:161

友情鏈接