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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linux等待線程全部停止的方法(linux等待所有線程結(jié)束)

在Linux系統(tǒng)中,線程是可以進(jìn)行并發(fā)操作的,多個線程可以同時運行,因此在編寫多線程程序時,需要考慮線程的同步與狀態(tài)控制。在多線程程序中,有時需要等待所有線程完成任務(wù)后再進(jìn)行下一步操作,這就需要使用一些方法來實現(xiàn)線程的等待。

在本文中,將介紹幾種Linux系統(tǒng)中等待線程停止的方法。

1.使用pthread_join函數(shù)

pthread_join函數(shù)用于等待指定的線程終止并回收其資源。當(dāng)調(diào)用pthread_join函數(shù)時,主線程會被阻塞,直到指定的線程終止為止。

這個函數(shù)的調(diào)用格式如下所示:

“`

int pthread_join(pthread_t thread, void **retval);

“`

其中,參數(shù)thread是要等待的線程ID,參數(shù)retval是線程的返回值。如果不需要返回值,可以將retval設(shè)置為NULL。

在調(diào)用pthread_join函數(shù)時,如果指定的線程沒有終止,則主線程會一直等待,直到被指定的線程終止。

使用pthread_join函數(shù)等待線程停止的示例代碼如下:

“`c

#include

#include

#include

#include

void *thread_func(void *arg)

{

printf(“Sub thread is running\n”);

sleep(3);

printf(“Sub thread is exiting\n”);

pthread_exit(NULL);

}

int mn()

{

pthread_t tid;

int ret;

void *retval;

ret = pthread_create(&tid, NULL, thread_func, NULL);

if (ret != 0)

{

printf(“Create thread fled\n”);

return -1;

}

pthread_join(tid, &retval);

printf(“Mn thread is exiting\n”);

return 0;

}

“`

在這個示例中,主線程創(chuàng)建了一個子線程,子線程運行了3秒后就退出了。主線程調(diào)用pthread_join函數(shù)等待子線程終止,然后輸出“Mn thread is exiting”并退出。

2.使用pthread_cond_wt函數(shù)配合pthread_cond_signal函數(shù)

pthread_cond_wt和pthread_cond_signal函數(shù)用于線程之間的條件等待和條件喚醒。使用條件變量可以實現(xiàn)線程的同步與等待。

pthread_cond_wt函數(shù)的原型如下所示:

“`c

int pthread_cond_wt(pthread_cond_t *cond, pthread_mutex_t *mutex);

“`

參數(shù)cond是條件變量,參數(shù)mutex是互斥鎖。在調(diào)用pthread_cond_wt函數(shù)前,線程必須先獲取到mutex的鎖,然后才能調(diào)用pthread_cond_wt函數(shù)等待條件變量。

當(dāng)條件變量被喚醒時,pthread_cond_wt函數(shù)會自動釋放mutex鎖,然后再返回,線程可以從等待狀態(tài)中恢復(fù)。

pthread_cond_signal函數(shù)的原型如下所示:

“`c

int pthread_cond_signal(pthread_cond_t *cond);

“`

參數(shù)cond是條件變量,調(diào)用pthread_cond_signal函數(shù)后,等待在該條件變量上的一個線程會被喚醒。

pthread_cond_wt和pthread_cond_signal函數(shù)需要搭配使用,使用示例代碼如下:

“`c

#include

#include

#include

#include

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

int done = 0;

void *thread_func(void *arg)

{

printf(“Sub thread is running\n”);

sleep(3);

printf(“Sub thread is exiting\n”);

pthread_mutex_lock(&mutex);

done = 1;

pthread_cond_signal(&cond);

pthread_mutex_unlock(&mutex);

pthread_exit(NULL);

}

int mn()

{

pthread_t tid;

int ret;

void *retval;

ret = pthread_create(&tid, NULL, thread_func, NULL);

if (ret != 0)

{

printf(“Create thread fled\n”);

return -1;

}

pthread_mutex_lock(&mutex);

while (!done)

{

pthread_cond_wt(&cond, &mutex);

}

pthread_mutex_unlock(&mutex);

printf(“Mn thread is exiting\n”);

return 0;

}

“`

在這個示例中,主線程創(chuàng)建了一個子線程,子線程運行了3秒后就退出了。主線程使用互斥鎖和條件變量等待子線程終止。當(dāng)done變量的值被設(shè)置為1時,子線程會調(diào)用pthread_cond_signal函數(shù)喚醒一個等待在條件變量上的線程,主線程就可以從等待狀態(tài)中恢復(fù)。

3.使用pthread_barrier_wt函數(shù)

pthread_barrier_wt函數(shù)用于等待一個屏障,屏障可以控制多個線程同時開始或結(jié)束。當(dāng)?shù)鹊剿芯€程到達(dá)屏障時,pthread_barrier_wt函數(shù)會返回,并允許所有線程同時開始或結(jié)束。

pthread_barrier_wt函數(shù)的原型如下所示:

“`c

int pthread_barrier_wt(pthread_barrier_t *barrier);

“`

參數(shù)barrier是屏障變量,在調(diào)用pthread_barrier_wt函數(shù)前,所有線程必須先調(diào)用pthread_barrier_init函數(shù)初始化屏障變量。

在多線程程序中使用pthread_barrier_wt函數(shù)等待線程停止的示例代碼如下:

“`c

#include

#include

#include

#include

pthread_barrier_t barrier;

void *thread_func(void *arg)

{

printf(“Sub thread is running\n”);

sleep(3);

printf(“Sub thread is exiting\n”);

pthread_barrier_wt(&barrier);

pthread_exit(NULL);

}

int mn()

{

pthread_t tid1, tid2;

int ret;

void *retval;

pthread_barrier_init(&barrier, NULL, 2);

ret = pthread_create(&tid1, NULL, thread_func, NULL);

if (ret != 0)

{

printf(“Create thread1 fled\n”);

return -1;

}

ret = pthread_create(&tid2, NULL, thread_func, NULL);

if (ret != 0)

{

printf(“Create thread2 fled\n”);

return -1;

}

pthread_barrier_wt(&barrier);

printf(“Mn thread is exiting\n”);

return 0;

}

“`

在這個示例中,主線程創(chuàng)建了兩個子線程,當(dāng)所有子線程到達(dá)屏障時,主線程就可以從等待狀態(tài)中恢復(fù),并輸出“Mn thread is exiting”并退出。在使用pthread_barrier_wt函數(shù)時,必須先調(diào)用pthread_barrier_init函數(shù)初始化屏障變量。

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

  • linux下多進(jìn)程或者多線程編程的問題。新手,望指教!

linux下多進(jìn)程或者多線程編程的問題。新手,望指教!

之一個問題,不管是創(chuàng)建進(jìn)程或者創(chuàng)建線程都不會阻塞,創(chuàng)建完畢馬上返回不會等待子進(jìn)程或者子線程的運行

第二個問題

首先進(jìn)程和線程是不一樣的

多進(jìn)程時,父進(jìn)程如果先結(jié)束,那么子進(jìn)程會被init進(jìn)程接收成為init進(jìn)程的子進(jìn)程,接下來子進(jìn)程接著運行,直到結(jié)束,init進(jìn)程負(fù)責(zé)轎晌取得這些子進(jìn)程的結(jié)束狀態(tài)并釋放進(jìn)程資源。而如果是子進(jìn)程先結(jié)束,那么父進(jìn)程應(yīng)當(dāng)用wait或者waitpid去獲取子進(jìn)程的結(jié)束狀態(tài)并釋放進(jìn)程資源,否則子進(jìn)程會成為僵死進(jìn)程,它占用的閉陪鋒進(jìn)程資源不會釋放

多線程時,如果父線程或者說你講的main結(jié)束時使用return或者exit或者處理完畢結(jié)束,那么整個進(jìn)程都結(jié)束,其他子線程自然結(jié)束。如果main結(jié)束時使亂神用的是pthread_exit那么只有父線程結(jié)束,子線程還在運行。同樣對于子線程結(jié)束時如果調(diào)用了exit,那么整個進(jìn)程包括父線程結(jié)束,如果調(diào)用了pthread_exit或者正常結(jié)束,那么只有子線程結(jié)束。

另外子線程結(jié)束時如果沒有分離屬性,其他線程應(yīng)當(dāng)使用pthread_join去獲取線程結(jié)束狀態(tài)并釋放線程資源,如同進(jìn)程里的wait和waitpid

你好,多進(jìn)程或多線御御程,都不會阻塞當(dāng)前語句代碼。為了您的理解,我就大膽舉下面兩個例子:

多進(jìn)程:你可以看成是本來是一條路的,現(xiàn)在從中間拆成兩條,然后每一條路都有屬于自己這條路的代碼在運行。

多線程:你可以看成是一條路,然后分出車道,比如檔拆鋒左車道和右車道甚至是停車道,然后每條車道都單獨通車,其他車道的不能對這條車道進(jìn)行干擾。

所以,把一條路從中間行晌拆成兩條,成本是很高的。但是把一條路分車道,成本就不是很高了。

對于您提出的main函數(shù)的疑問,當(dāng)main函數(shù)最后執(zhí)行完畢,程序退出后,所有的進(jìn)程包括線程,都會被關(guān)閉的,哪怕你的程序中沒有關(guān)閉,操作系統(tǒng)也會幫你關(guān)閉的,現(xiàn)在的操作系統(tǒng)都非常的完善了。當(dāng)然,也存在有線程或進(jìn)程不被釋放的特殊情況,更好在編程中要記得釋放。

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

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


網(wǎng)站欄目:Linux等待線程全部停止的方法(linux等待所有線程結(jié)束)
本文來源:http://www.dlmjj.cn/article/djepcip.html