日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Linux中進(jìn)程如何創(chuàng)建線程(linux進(jìn)程中創(chuàng)建線程)

在Linux中,進(jìn)程是計(jì)算機(jī)程序的基本執(zhí)行單元,而線程是進(jìn)程內(nèi)部的并發(fā)執(zhí)行流。線程能夠共享進(jìn)程的資源,如內(nèi)存空間、文件句柄等。在這種情況下,它們可以協(xié)同工作,以便高效地完成任務(wù)。

盡管Linux內(nèi)核直接支持多線程應(yīng)用程序,但創(chuàng)建一個(gè)線程并不是容易的。許多程序員對(duì)它感到困惑,因?yàn)長(zhǎng)inux中線程的實(shí)際實(shí)現(xiàn)可能與其他操作系統(tǒng)不同。在本文中,我們將介紹Linux中創(chuàng)建線程的方法,以及如何在程序中正確使用它們。

Linux中的線程是什么?

在Linux中,線程是一種輕量級(jí)的進(jìn)程。每個(gè)線程都有自己的??臻g,但與進(jìn)程不同,它們共享相同的地址空間。這意味著,線程能夠訪問(wèn)相同的變量、函數(shù)以及文件等,從而可以在處理相同的數(shù)據(jù)時(shí)協(xié)作工作。

一個(gè)進(jìn)程創(chuàng)建的線程被稱為子線程,它們運(yùn)行在相同的上下文中,但它們有自己的堆棧。進(jìn)程本身也有一個(gè)主線程,它是之一個(gè)線程,它在進(jìn)程初始化時(shí)自動(dòng)創(chuàng)建。

Linux中創(chuàng)建線程的方法

在Linux中,應(yīng)用程序可以使用線程API創(chuàng)建線程。常見(jiàn)的API包括pthread_create()和clone()。

pthread_create()

pthread_create()是一個(gè)庫(kù)函數(shù),允許我們?cè)谶M(jìn)程中創(chuàng)建多個(gè)線程。它可以創(chuàng)建一個(gè)新的線程,并附加到進(jìn)程中。它的語(yǔ)法如下:

int pthread_create(pthread_t* thread, const pthread_attr_t* attr,void* (*start_routine)(void*), void* arg);

此函數(shù)的之一個(gè)參數(shù)為線程標(biāo)識(shí)符pthread_t,它是一個(gè)變量,用于存儲(chǔ)創(chuàng)建的線程的唯一標(biāo)識(shí)符。第二個(gè)參數(shù)為線程的屬性,我們通常將其設(shè)置為NULL。第三個(gè)參數(shù)是一個(gè)指向函數(shù)的指針,該函數(shù)是新線程的開(kāi)始函數(shù)。第四個(gè)參數(shù)是該函數(shù)的參數(shù),傳遞給線程函數(shù)的參數(shù)。

以下是使用pthread_create()函數(shù)創(chuàng)建并啟動(dòng)一個(gè)簡(jiǎn)單線程的示例:

#include

#include

void *print_message_function( void *ptr );

int mn()

{

pthread_t thread1, thread2;

char *message1 = “Thread 1”;

char *message2 = “Thread 2”;

int iret1, iret2;

// 創(chuàng)建線程1

iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);

// 創(chuàng)建線程2

iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);

// 等待線程1執(zhí)行完

pthread_join( thread1, NULL);

// 等待線程2執(zhí)行完

pthread_join( thread2, NULL);

printf(“Thread 1 returns: %d\n”,iret1);

printf(“Thread 2 returns: %d\n”,iret2);

}

void *print_message_function( void *ptr )

{

char *message;

message = (char *) ptr;

printf(“%s \n”, message);

}

在上述代碼中,我們創(chuàng)建了兩個(gè)線程thread1和thread2,并分別將它們賦值為參數(shù)。然后,使用pthread_create()函數(shù)創(chuàng)建線程,并將線程函數(shù)指針和參數(shù)傳遞給函數(shù)。然后,我們等待線程執(zhí)行完,并檢查線程返回的值。

clone()

另一個(gè)創(chuàng)建線程的函數(shù)是clone()。它類似于pthread_create(),但它更為底層。clone()函數(shù)必須顯式提供線程棧和堆棧的空間。以下是一個(gè)使用clone()函數(shù)創(chuàng)建線程的示例:

#define _GNU_SOURCE /* 包含clone()函數(shù) */

#include

#include

#define STACK_SIZE 1024*1024

static char child_stack[STACK_SIZE];

void* child_fn(void* arg)

{

printf(“Child %ld running in new namespace\n”, (long)getpid());

return NULL;

}

int mn()

{

pid_t child_pid = clone(child_fn,child_stack+STACK_SIZE,SIGCHLD,NULL);

printf(“clone()=%ld\n”, (long)child_pid);

getchar(); /* 繼續(xù)運(yùn)行以查看輸出結(jié)果 */

return 0;

}

在上述代碼中,我們使用了clone()函數(shù)來(lái)創(chuàng)建新的進(jìn)程,并將創(chuàng)建的新進(jìn)程的地址存儲(chǔ)在變量child_pid中。線程函數(shù)為child_fn()。

線程常見(jiàn)問(wèn)題

創(chuàng)建線程時(shí)有許多問(wèn)題,包括如何同步線程、如何處理線程處理的異常,如何避免線程之間的競(jìng)爭(zhēng)等。以下是一些常見(jiàn)的線程問(wèn)題:

線程同步

線程同步是一個(gè)重要的問(wèn)題,因?yàn)槿绻鄠€(gè)線程同時(shí)訪問(wèn)共享資源,會(huì)出現(xiàn)數(shù)據(jù)不一致的問(wèn)題。因此,使用線程同步技術(shù)來(lái)協(xié)調(diào)并發(fā)線程非常重要,以避免這種沖突。線程同步包括鎖、條件變量和信號(hào)量等。

線程異常

當(dāng)線程中的一個(gè)操作無(wú)法執(zhí)行時(shí),例如分配內(nèi)存失敗或輸入格式不正確時(shí),線程將返回異常。這時(shí),應(yīng)該為線程實(shí)現(xiàn)一個(gè)錯(cuò)誤處理功能,以便在發(fā)生異常時(shí)能夠及時(shí)處理錯(cuò)誤信息。

線程競(jìng)爭(zhēng)

如果兩個(gè)或更多線程在同一時(shí)間訪問(wèn)同一數(shù)據(jù),就會(huì)發(fā)生競(jìng)爭(zhēng)。這可能導(dǎo)致數(shù)據(jù)丟失,死鎖和其他問(wèn)題。線程競(jìng)爭(zhēng)可以通過(guò)正確實(shí)現(xiàn)線程同步來(lái)避免。

結(jié)論

相關(guān)問(wèn)題拓展閱讀:

  • linux進(jìn)程、線程及調(diào)度算法(三)

linux進(jìn)程、線程及調(diào)度算法(三)

調(diào)度策略值得是大家都在ready時(shí),并且CPU已經(jīng)被調(diào)度時(shí),決定誰(shuí)來(lái)運(yùn)行,誰(shuí)來(lái)被調(diào)度。

兩者之間有一定矛盾。

響應(yīng)的優(yōu)化,意味著高優(yōu)先級(jí)會(huì)搶占優(yōu)先級(jí),會(huì)花時(shí)間在上下文切換,會(huì)影響吞吐。

上下文切換的時(shí)間是很短的,幾微妙就能搞定。上下文切換本身對(duì)吞吐并多大影響,

重要的是,切換后引起的cpu 的 cache miss.

每次切換APP, 數(shù)據(jù)都要重新load一次。

Linux 會(huì)盡可能的在響應(yīng)與吞吐之間尋找平衡。比如在編譯linux的時(shí)候,會(huì)讓你選擇 kernal features -> Preemption model.

搶占模型會(huì)影響linux的調(diào)度算法。

所以 ARM 的架構(gòu)都是big+LITTLE, 一個(gè)很猛CPU+ 多個(gè) 性能較差的 CPU, 那么可以把I/O型任務(wù)的調(diào)度指源 放在 LITTLE CPU上。需要計(jì)算的放在big上。

早期2.6 內(nèi)核將優(yōu)先級(jí)劃分了bit的優(yōu)先級(jí)。數(shù)值越低,優(yōu)先級(jí)越高。0-99優(yōu)先級(jí) 都是 RT(即時(shí)響應(yīng))的 ,都是非RT的,即normal。

調(diào)度的時(shí)候 看哪個(gè)bitmap 中的 優(yōu)先級(jí)上有任務(wù)ready??赡芏鄠€(gè)任務(wù)哦。

在普通優(yōu)先級(jí)線程調(diào)度中,高優(yōu)先級(jí)并不代表對(duì)低優(yōu)先級(jí)的絕對(duì)優(yōu)勢(shì)。會(huì)在不同優(yōu)先級(jí)進(jìn)行輪轉(zhuǎn)。

就是比101高,101也會(huì)比102高,但100 不會(huì)堵著101。

眾絲進(jìn)程在輪轉(zhuǎn)時(shí),優(yōu)先級(jí)高的:

初始唯并態(tài)設(shè)置nice值為0,linux 會(huì)探測(cè) 你是喜歡睡眠,還是干活。越喜歡睡,linux 越獎(jiǎng)勵(lì)你,優(yōu)先級(jí)上升(nice值減少)。越喜歡干活,優(yōu)先級(jí)下降(nice值增加)。所以一個(gè)進(jìn)程在linux中,干著干著 優(yōu)先級(jí)越低,睡著睡著 優(yōu)先級(jí)越高。

后期linux補(bǔ)丁中

紅黑樹(shù),數(shù)據(jù)結(jié)構(gòu), 左邊節(jié)點(diǎn)小于右邊節(jié)點(diǎn)

同時(shí)兼顧了 CPU/IO 和 nice。

數(shù)值代表著 進(jìn)程運(yùn)行到目前為止的virtual runtime 時(shí)間。

(pyhsical runtime) / weight * 1024(系數(shù))。

優(yōu)先調(diào)度 節(jié)點(diǎn)值(vruntime)最小的線程。權(quán)重weight 其實(shí)有nice 來(lái)控制。

一個(gè)線程一旦被調(diào)度到,則物理運(yùn)行時(shí)間增加,vruntime增加,往左邊走。

weight的增加,也導(dǎo)致vruntime減小,往右邊走。

總之 CFS讓線程 從左滾到右,從右滾到左。即照顧了I/O(喜歡睡,分子小) 也 照顧了 nice值低(分母高).所以 由喜歡睡,nice值又低的線程,最容易被調(diào)度到。

自動(dòng)調(diào)整,無(wú)需向nice一樣做出獎(jiǎng)勵(lì)懲罰動(dòng)作,個(gè)人理解權(quán)重其實(shí)相當(dāng)于nice

但是 此時(shí) 來(lái)蔽拍一個(gè) 0-99的線程,進(jìn)行RT調(diào)度,都可以瞬間秒殺你!因?yàn)槿思也皇瞧胀ǖ?,是RT的!

一個(gè)多線程的進(jìn)程中,每個(gè)線程的調(diào)度的策略 如 fifo rr normal, 都可以不同。每一個(gè)的優(yōu)先級(jí)都可以不一樣。

實(shí)驗(yàn)舉例, 創(chuàng)建2個(gè)線程,同時(shí)開(kāi)2個(gè):

運(yùn)行2次,創(chuàng)建兩個(gè)進(jìn)程

sudo renice -n -5(nice -5級(jí)別) -g(global), 會(huì)明顯看到 一個(gè)進(jìn)程的CPU占用率是另一個(gè)的 3倍。

為什么cpu都已經(jīng)達(dá)到200%,為什么系統(tǒng)不覺(jué)得卡呢?因?yàn)椋覀兊木€程在未設(shè)置優(yōu)先級(jí)時(shí),是normal調(diào)度模式,且是

CPU消耗型

調(diào)度級(jí)別其實(shí)不高。

利用chrt工具,可以將進(jìn)程 調(diào)整為 50 從normal的調(diào)度策略 升為RT (fifo)級(jí)別的調(diào)度策略,會(huì)出現(xiàn):

chrt , nice renice 的調(diào)度策略 都是以線程為單位的,以上 設(shè)置的將進(jìn)程下的所有線程進(jìn)行設(shè)置nice值

線程是調(diào)度單位,進(jìn)程不是,進(jìn)程是資源封裝單位!

兩個(gè)同樣死循環(huán)的normal優(yōu)先級(jí)線程,其中一個(gè)nice值降低,該線程的CPU 利用率就會(huì)比另一個(gè)CPU的利用率高。

關(guān)于linux 進(jìn)程中創(chuàng)建線程的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。


分享文章:Linux中進(jìn)程如何創(chuàng)建線程(linux進(jìn)程中創(chuàng)建線程)
文章起源:http://www.dlmjj.cn/article/dpdiojh.html