當前位置:首頁 » 操作系統 » linux線程參數

linux線程參數

發布時間: 2022-02-27 07:33:27

1. linux 並行 線程選多少合適

具體問題具體分析,如果你主要是做純計算(比如數學運算,物理計算等),那麼線程數應該等於cpu核心數。如果主要是io操作(即需要訪問硬體外設),一般來說線程數的提升並不能提高運行速度。 如果是 計算 + IO, 一般來說線程數應該大於cpu核心數。

總的來說,除了第一種,後兩種情況都應該實際測試看效果。

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

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

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

3. linux c編程中,使用pthread_create函數創建線程時,函數的第3個參數的是void

可以這樣聲明,但是在調用pthread_create函數的時候需要將線程函數的指針強制類型轉換成void *(pthread)(void*),否則編譯器會報錯。

4. linux中一個進程的最大線程數量是多少

linux 系統中單個進程的最大線程數有其最大的限制 PTHREAD_THREADS_MAX
這個限制可以在 /usr/include/bits/local_lim.h 中查看關於Linux命令的介紹,看看《linux就該這么學》,具體關於這一章地址3w(dot)linuxprobe/chapter-02(dot)html
對 linuxthreads 這個值一般是 1024,對於 nptl 則沒有硬性的限制,僅僅受限於系統的資源
這個系統的資源主要就是線程的 stack 所佔用的內存,用 ulimit -s 可以查看默認的線程棧大小,一般情況下,這個值是 8M

5. linux中線程有哪些屬性

線程的資源是共享的,進程的資源是分開的。多個線程同時訪問一塊資源時一定要注意不能沖突,可以用信號量和鎖的思想來解決反問同一個資源問題。

6. 在linux下,我創建兩個線程,打開一個文件,怎麼實現在線程之間參數的傳遞

進程內的線程會共享進程的資源,包括文件句柄

pthread_create的實現
pthread_create是基於clone實現的, 創建出來的其實是進程, 但這些進程與父進程共享很多東西, 共享的東西都不用復制給子進程, 從而節省很多開銷, 因此,這些子進程也叫輕量級進程(light-weight process)

7. linux線程函數能傳遞兩個參數嗎

你可以將你的所有參數放在一個結構體里,然後將這個結構體指針傳進去

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

LinuxThread的線程機制

LinuxThreads是目前Linux平台上使用最為廣泛的線程庫,由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分配和維護。

9. C++ linux 多線程 多個參數

你要把兩個參數放在一個結構體裡面
stuct arge{
set<int ,int>

char *

};
然後把 arge 的指針傳給 pathred_create 只有這種辦法..

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

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

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

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

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

熱點內容
php全形半形 發布:2024-12-23 14:55:17 瀏覽:825
手機上傳助手 發布:2024-12-23 14:55:14 瀏覽:729
什麼樣的主機配置吃雞開全效 發布:2024-12-23 14:55:13 瀏覽:827
安卓我的世界114版本有什麼 發布:2024-12-23 14:42:17 瀏覽:707
vbox源碼 發布:2024-12-23 14:41:32 瀏覽:274
詩經是怎麼存儲 發布:2024-12-23 14:41:29 瀏覽:656
屏蔽視頻廣告腳本 發布:2024-12-23 14:41:24 瀏覽:416
php解析pdf 發布:2024-12-23 14:40:01 瀏覽:815
多看閱讀上傳 發布:2024-12-23 14:34:05 瀏覽:176
編程高性能 發布:2024-12-23 14:33:31 瀏覽:114