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

linux多線程

發布時間: 2022-01-28 17:00:42

A. linux下多線程的如何執行

主線程結束,則進程結束,屬於該進程的所有線程都會結束,可以在主線程中join,也可以在主線程中加死循環。

B. Linux線程的幾種結束方式

Linux線程的幾種結束方式
Linux創建線程使用
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg)
1
2
Linux線程的幾種結束方式:
調用pthread_exit(exit_code),exit_code為線程退出的狀態代碼。同一進程下的其他線程可以通過pthread_join(exit_code)來使用。
函數start_routine使用return返回,與調用pthread_exit()作用相同。
線程被取消pthread_cancel()。
同一進程中的其他線程調用了exit(),,或者主線程從main函數返回。

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

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

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

D. linux多線程情況下,線程多長時間進行一次切換

linux下線程分為用戶級線程和內核級線程,在內核來看,線程和進程是一樣的,本質上沒有區別
內核提供的是創建進程的介面do_fork()。內核提供了兩個系統調用clone()和fork(),最終都用不同的參數調用do_fork()核內API。當然,要想實現線程,沒有核心對多進程(其實是輕量級進程)共享數據段的支持是不行的,因此,do_fork()提供了很多參數,包括CLONE_VM(共享內存空間)、CLONE_FS(共享文件系統信息)、 CLONE_FILES(共享文件描述符表)、CLONE_SIGHAND(共享信號句柄表)和CLONE_PID(共享進程ID,僅對核內進程,即0號進程有效)。當使用fork系統調用時,內核調用do_fork()不使用任何共享屬性,進程擁有獨立的運行環境,而使用 pthread_create()來創建線程時,則最終設置了所有這些屬性來調用__clone(),而這些參數又全部傳給核內的do_fork(),從而創建的「進程」擁有共享的運行環境,只有棧是獨立的,由__clone()傳入。
具體可以參考<<深入理解Linux內核>>第三版,講的非常詳細

E. linux 最多支持多少個線程

默認情況下:
主線程+輔助線程 +<253個自己的線程<=255
含主線程和一個輔助線程,最多255個,即一個用戶只能生成253個線程。
Linux最大線程數限制及當前線程數查詢:
1、總結系統限制有:
/proc/sys/kernel/pid_max #查系統支持的最大線程數,一般會很大,相當於理論值
/proc/sys/kernel/thread-max
max_user_process(ulimit -u) #系統限制某用戶下最多可以運行多少進程或線程
/proc/sys/vm/max_map_count
硬體內存大小
2、java虛擬機本身限制:
-Xms #intial java heap size
-Xmx #maximum java heap size
-Xss #the stack size for each thread
3、查詢當前某程序的線程或進程數
pstree -p `ps -e | grep java | awk '{print $1}'` | wc -l 或 pstree -p 3660 | wc -l
4、查詢當前整個系統已用的線程或進程數
pstree -p | wc -l
1、 cat /proc/${pid}/status
2、pstree -p ${pid}
3、top -p ${pid} 再按H 或者直接輸入 top -bH -d 3 -p ${pid}
top -H
手冊中說:-H : Threads toggle
加上這個選項啟動top,top一行顯示一個線程。否則,它一行顯示一個進程。
4、ps xH
手冊中說:H Show threads as if they were processes
這樣可以查看所有存在的線程。
5、ps -mp <PID>
手冊中說:m Show threads after processes
這樣可以查看一個進程起的線程數。

F. linux多線程為什麼不能同時操作同一個全局變數

因為多線程的執行和CPU調度、進程調度有關,簡單的理解就是進程調度是把CPU資源分為時間片,各個進程輪番執行,多線程的情況和這個類似。如果有一個全局變數,有的線程是進行寫操作,有的線程是進行讀操作,假設程序員希望的是先對全局變數進行寫,在另一個線程進行讀,但是那個線程先執行不是我們能控制的,這個調度工作屬於操作系統內核,內核有它的考量,程序無法干預,而且每個線程的運行時間也不一樣,這個也影響線程執行順序,你就把這個執行順序看成是隨機的吧(免得你抱有幻想)。所以實際的執行順序有可能是先由一個線程進行讀,然後才有另一個線程進行寫操作,這樣就讀到了一個舊的值,這就是邏輯錯誤咯,典型的bug啊。
其實多線程也不是不能同時操作同一個全局變數,只要用上了多線程裡面的「線程同步」技術就可以了。

G. linux線程如何運行

pthread_create執行後,如果執行成功會生成一個子線程 也就是現在有兩個線程同時運行
父線程還會繼續執行後面的代碼 直到結束
子線程則開始執行thread函數體里的代碼了 別的不執行
pthread_join會按照父線程執行順序 到它了就會執行 該函數的作用是阻塞等待一個線程執行完畢
在你的代碼里 不一定在子線程執行3次後才啟動 也可能子線程沒有執行呢 父線程就執行到pthread_join了 然後阻塞等待子線程
如果你想讓pthread_join在子線程3次執行後才啟動 可以讓父線程sleep下 不過子線程執行完了 你再執行pthread_join也就沒有什麼意義了
不懂再問

H. java的多線程與linux的多線程的關系

java自己實現了線程庫,也就是說java的線程並不和操作系統的線程對應,jvm在操作系統上面是一個進程,當這個進程被操作系統調度到後,jvm內部實現的線程庫再調度java線程,為什麼是這樣呢?考慮到以前的操作系統內核,比如linux,在以前都不直接支持線程,用戶線程和內核線程是多對一的關系,solaris一度也是這樣,所以java當然心有餘而力不足了,你操作系統都不能完美支持線程,你讓我實現不是難為我嗎?在那個年代,java多線程的調度完全是自主的,操作系統根本不知道java是多線程的,調度策略完全自己實現,單cpu下肯定是分時的,多cpu下就看jvm會不會建立多cpu上的多jvm實例了。
到了後來,操作系統內核紛紛都支持了多線程(windows開始就支持),那麼java也要考慮推卸一些責任了,這樣java線程就和操作系統線程一一對應或多多對應了,這個時候,如果是一一對應,那麼線程的調度完全交給了操作系統內核,當然jvm還保留一些策略足以影響到其內部的線程調度,舉個例子,在linux下,只要一個Thread.run就會調用一個fork產生一個線程。
問:java獲得cup使用權採用的搶占機制,使用cup的時候是分時機制,這句話對不對?
答:部分對,早期實現,基本可以實現搶占式,但是現代實現,如果系統不支持搶占,那麼jvm也無所謂搶佔了。
問:多線程使用cup和使用的操作系統有關還是java機制有關(xp是什麼機制)
答:早期是java機制實現,現在大部分是操作系統實現的,java機制僅僅保留了相關策略從而影響調度;xp是基於優先順序的搶占式調度,其性能很大程度依賴於動態優先順序提升

I. Linux多線程編程

程序代碼test.c共兩個線程,一個主線程,一個讀緩存區的線程:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
char globe_buffer[100];

void *read_buffer_thread(void *arg); //這里先聲明一下讀緩存的線程,具體實現寫在後面了

int main()
{
int res,i;
pthread_t read_thread;
for(i=0;i<20;i++)
globe_buffer[i]=i;
printf("\nTest thread : write buffer finish\n");
sleep(3);\\這里的3秒是多餘,可以不要。
res = pthread_create(&read_thread, NULL, read_buffer_thread, NULL);
if (res != 0)
{
printf("Read Thread creat Error!");
exit(0);
}
sleep(1);
printf("waiting for read thread to finish...\n");

res = pthread_join(read_thread, NULL);
if (res != 0)
{
printf("read thread join failed!\n");
exit(0);
}
printf("read thread test OK, have fun!! exit ByeBye\n");
return 0;
}
void *read_buffer_thread(void *arg)
{
int i,x;
printf("Read buffer thread read data : \n");
for(i=0;i<20;i++)
{
x=globe_buffer[i];
printf("%d ",x);
globe_buffer[i]=0;//清空
}
printf("\nread over\n");
}
---------------------------------------------------------------------------------
以上程序編譯
gcc -D_REENTRANT test.c -o test.o –lpthread
運行這個程序:
$ ./test.o:

熱點內容
訪問攔截怎麼解除安卓 發布:2024-09-20 17:28:48 瀏覽:275
蘿卜干存儲 發布:2024-09-20 17:21:37 瀏覽:715
蘋果手機如何遷移軟體到安卓手機 發布:2024-09-20 17:21:34 瀏覽:691
查看伺服器ip限制 發布:2024-09-20 16:56:27 瀏覽:389
p搜系統只緩存1頁為什麼 發布:2024-09-20 16:48:51 瀏覽:838
上網的賬號和密碼是什麼東西 發布:2024-09-20 16:31:31 瀏覽:612
安卓手機王者榮耀如何調超高視距 發布:2024-09-20 16:31:30 瀏覽:428
安卓G是什麼app 發布:2024-09-20 16:23:09 瀏覽:81
iphone怎麼壓縮文件 發布:2024-09-20 16:08:18 瀏覽:356
linux查看用戶名密碼是什麼 發布:2024-09-20 16:03:20 瀏覽:744