0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用pthread_barrier_xxx系列函數(shù)來(lái)實(shí)現(xiàn)多線程之間的同步?

嵌入式那些事 ? 來(lái)源:嵌入式那些事 ? 2023-10-23 14:43 ? 次閱讀

Linux系統(tǒng)中提供了多種同步機(jī)制,本文主要講講如何使用pthread_barrier_xxx系列函數(shù)來(lái)實(shí)現(xiàn)多線程之間進(jìn)行同步的方法。

函數(shù)定義

pthread_barrier_xxx系列函數(shù)中的barrier可意為柵欄,可以理解為該柵欄能夠把先后到達(dá)的多個(gè)線程阻擋在同一柵欄前,直到所有線程到齊,柵欄才會(huì)放行,否則到達(dá)此處的線程將被阻塞。

pthread_barrier_xxx系列函數(shù)在文件中定義,用于多線程的同步,該系列函數(shù)主要包含下列三個(gè)函數(shù):

//初始化柵欄,負(fù)責(zé)指定柵欄要等待的線程個(gè)數(shù),
//柵欄需要等待count個(gè)線程都到達(dá)柵欄時(shí),才會(huì)全部一起放行
intpthread_barrier_init(pthread_barrier_t*restrict,
constpthread_barrierattr_t*restrict,unsignedcount);

//pthread_barrier_wait()函數(shù)會(huì)同步所有參與barrier的線程,
//調(diào)用該函數(shù)的線程會(huì)阻塞住,直到pthread_barrier_init()中指定
//數(shù)量的線程調(diào)用了pthread_barrier_wait()函數(shù),所有線程才會(huì)同時(shí)往下執(zhí)行
intpthread_barrier_wait(pthread_barrier_t*barrier);

//釋放pthread_barrier_init()函數(shù)申請(qǐng)的資源
intpthread_barrier_destroy(pthread_barrier_t*barrier);

應(yīng)用場(chǎng)景

在應(yīng)用程序啟動(dòng)的時(shí)候,需要?jiǎng)?chuàng)建一個(gè)或者多個(gè)線程去完成不同功能的處理。子線程啟動(dòng)之后,需要等待主進(jìn)程完成基礎(chǔ)的配置之后各個(gè)子線程才能正常工作。所以這里就存在一個(gè)問(wèn)題要解決,各個(gè)子線程如何等待主進(jìn)程完成工作后,才繼續(xù)往下執(zhí)行呢?

為了解決上述場(chǎng)景的問(wèn)題,我們可以在調(diào)用pthread_barrier_init()時(shí)指定n+1個(gè)等待,其中n是線程數(shù)。而在每個(gè)線程執(zhí)行函數(shù)的開(kāi)始調(diào)用pthread_barrier_wait()。這樣主進(jìn)程在調(diào)用pthread_create()創(chuàng)建子線程后,子線程運(yùn)行到pthread_barrier_wait()后將被阻塞,線程都停下來(lái)等待最后一個(gè)pthread_barrier_wait()函數(shù)被調(diào)用。最后一個(gè)pthread_barrier_wait()函數(shù)由主進(jìn)程或者其他子線程在它覺(jué)得合適的時(shí)候調(diào)用就行。最后這個(gè)pthread_barrier_wait()有點(diǎn)像跑步運(yùn)動(dòng)時(shí)的起步槍?zhuān)挥凶詈筮@個(gè)pthread_barrier_wait()函數(shù)被調(diào)用,其他被阻塞的線程就能夠繼續(xù)運(yùn)行。

使用實(shí)例

下面的程序,在main()函數(shù)中,pthread_barrier_init()指定2+1個(gè)等待,接著創(chuàng)建了2個(gè)線程,然后主進(jìn)程延時(shí)6秒,之后調(diào)用pthread_barrier_wait()來(lái)讓線程接著運(yùn)行,程序如下:

/*
********************************************************************************
*描述:pthread_barrier_xxx程序示例
*Use:gccpthread_barrier_xxx.c-lpthread
*./a.out
*By:AilsonJack
*Date:2016.03.24
*CSDN//blog.csdn.net/jackailson
********************************************************************************
*/

#include
#include
#include
#include

//線程?hào)艡?pthread_barrier_tbarrier;

void*task1(void*arg);
void*task2(void*arg);

intmain(void)
{
pthread_ttask1_tid;
pthread_ttask2_tid;
pthread_attr_ttask1_attr;
pthread_attr_ttask2_attr;

//初始化線程屬性
pthread_attr_init(&task1_attr);
pthread_attr_init(&task2_attr);

//初始化柵欄
pthread_barrier_init(&barrier,NULL,2+1);//2+1個(gè)等待

//創(chuàng)建線程1
pthread_create(&task1_tid,&task1_attr,task1,NULL);

//創(chuàng)建線程2
pthread_create(&task2_tid,&task2_attr,task2,NULL);

printf("mainprocesswillsleep6s.
");
sleep(6);//等待6s,讓task1和task2都阻塞住了,再運(yùn)行主線程

//主線程調(diào)用pthread_barrier_wait()函數(shù)之后,已經(jīng)達(dá)到了
//pthread_barrier_init()函數(shù)設(shè)置的3個(gè)等待條件,此時(shí)調(diào)用
//pthread_barrier_wait()函數(shù)的主線程不會(huì)被阻塞,task1和
//task2也將繼續(xù)運(yùn)行.
pthread_barrier_wait(&barrier);

pthread_join(task1_tid,NULL);
pthread_join(task2_tid,NULL);
pthread_barrier_destroy(&barrier);
}

void*task1(void*arg)
{
printf("task1willbeblocked.
");
pthread_barrier_wait(&barrier);//線程將被阻塞在這里
printf("task1isrunning.
");
sleep(3);//延時(shí)3s
pthread_exit(NULL);
}

void*task2(void*arg)
{
printf("task2willbeblocked.
");
pthread_barrier_wait(&barrier);//線程將被阻塞在這里
printf("task2isrunning.
");
sleep(3);//延時(shí)3s
pthread_exit(NULL);
}

程序的運(yùn)行結(jié)果如下圖所示:

3dd9dff2-716e-11ee-939d-92fbcf53809c.png







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux系統(tǒng)
    +關(guān)注

    關(guān)注

    4

    文章

    587

    瀏覽量

    27177
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    275

    瀏覽量

    19850

原文標(biāo)題:Linux應(yīng)用編程-pthread_barrier_xxx介紹

文章出處:【微信號(hào):嵌入式那些事,微信公眾號(hào):嵌入式那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    多線程程之一: 問(wèn)題提出

    進(jìn)行多線程的程序設(shè)計(jì),并提供了操作系統(tǒng)原理中的各種同步、互斥和臨界區(qū)等操作。Visual C++ 6.0中,使用MFC類(lèi)庫(kù)也實(shí)現(xiàn)多線程的程序設(shè)計(jì),使得
    發(fā)表于 10-22 11:41

    多線程程之線程同步

    多線程程之線程同步八、線程同步  雖然多線程
    發(fā)表于 10-22 11:43

    線程的分離狀態(tài) pthread

    pthread_create函數(shù)返回之前就終止了,它終止以后就可能將線程號(hào)和系統(tǒng)資源移交給其他的線程使用,這樣調(diào)用pthread_crea
    發(fā)表于 09-26 09:36

    Linux下多線程機(jī)制

    1 線程不能獨(dú)立運(yùn)行,要依附于進(jìn)程2 如果創(chuàng)建一個(gè)子線程只需要重新分配??臻g3 多個(gè)線程可以并行運(yùn)行4 線程之間可以有共同的全局變量(全局區(qū),任何
    發(fā)表于 11-11 09:53

    Linux下多線程機(jī)制

    1 線程不能獨(dú)立運(yùn)行,要依附于進(jìn)程  2 如果創(chuàng)建一個(gè)子線程只需要重新分配??臻g  3 多個(gè)線程可以并行運(yùn)行  4 線程之間可以有共同的全局變量(全局區(qū), 任何
    發(fā)表于 01-10 14:59

    Linux多線程線程同步

    ,而且很不方便。線程則不然,由于同一進(jìn)程下的線程之間共享數(shù)據(jù)空間,所以一個(gè)線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,而且方便。3、線程
    發(fā)表于 12-08 14:14

    linux多線程常用相關(guān)函數(shù)簡(jiǎn)介

    釋放,但是可以用pthread_join()函數(shù)來(lái)同步并釋放資源。 說(shuō)明:retval:pthread_exit()調(diào)用線程的返回值,可由其
    發(fā)表于 06-27 08:36

    多線程程之Linux線程編程

    的可移植性。 (1)函數(shù)說(shuō)明。 創(chuàng)建線程實(shí)際上就是確定調(diào)用該線程函數(shù)的入口點(diǎn),這里通常使用的函數(shù)pth
    發(fā)表于 10-18 15:55 ?3次下載

    mfc多線程編程實(shí)例及代碼,mfc多線程間通信介紹

    摘要:本文主要以MFC多線程為中心,分別對(duì)MFC多線程的實(shí)例、MFC多線程之間的通信展開(kāi)的一系列研究,下面我們來(lái)看看原文。
    發(fā)表于 12-08 15:23 ?1.7w次閱讀
    mfc<b class='flag-5'>多線程</b>編程實(shí)例及代碼,mfc<b class='flag-5'>多線程</b>間通信介紹

    linux多線程之pthread用法

    當(dāng)創(chuàng)建線程成功時(shí),函數(shù)返回0,若不為0則說(shuō)明創(chuàng)建線程失敗,常見(jiàn)的錯(cuò)誤返回代碼為EAGAIN和EINVAL。
    發(fā)表于 04-23 14:14 ?6809次閱讀
    linux<b class='flag-5'>多線程之</b><b class='flag-5'>pthread</b>用法

    linux多線程機(jī)制-線程同步

    ,而且可以在不同應(yīng)用程序的線程之間實(shí)現(xiàn)對(duì)資源的安全共享。Linux中通過(guò)pthread_mutex_t來(lái)定義互斥體機(jī)制完成互斥操作。具體的操作函數(shù)如下  
    發(fā)表于 04-02 14:42 ?397次閱讀

    Linux 多線程編程

    的區(qū)別, 創(chuàng)建完了就都是一樣的獨(dú)立個(gè)體創(chuàng)建完子線程之后,兩個(gè)線程之間獨(dú)立運(yùn)行,線程的執(zhí)行先后次序由OS的調(diào)度算法決定線程之間相互獨(dú)立也相互影響,因?yàn)橹?/div>
    發(fā)表于 04-02 14:49 ?592次閱讀

    PyQT5+OpenCV多線程協(xié)作演示

    學(xué)習(xí)多線程最典型的問(wèn)題就是如何在多個(gè)線程之間傳遞消息與寫(xiě)作,PyQT5的線程支持在不同線程之間傳遞信號(hào)觸發(fā)事件,實(shí)現(xiàn)多個(gè)
    的頭像 發(fā)表于 03-08 14:58 ?1175次閱讀

    多線程不進(jìn)行同步會(huì)造成什么問(wèn)題

    背景問(wèn)題:在特定的應(yīng)用場(chǎng)景下,多線程不進(jìn)行同步會(huì)造成什么問(wèn)題? 通過(guò)多線程模擬多窗口售票為例: #include #include #include #include #include
    的頭像 發(fā)表于 11-13 11:40 ?643次閱讀
    <b class='flag-5'>多線程</b>不進(jìn)行<b class='flag-5'>同步</b>會(huì)造成什么問(wèn)題

    多線程如何保證數(shù)據(jù)的同步

    多線程編程是一種并發(fā)編程的方法,意味著程序中同時(shí)運(yùn)行多個(gè)線程,每個(gè)線程可獨(dú)立執(zhí)行不同的任務(wù),共享同一份數(shù)據(jù)。由于多線程并發(fā)執(zhí)行的特點(diǎn),會(huì)引發(fā)數(shù)據(jù)同步
    的頭像 發(fā)表于 11-17 14:22 ?886次閱讀