在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

嵌入式那些事 ? 來源:嵌入式那些事 ? 2023-10-23 14:43 ? 次閱讀

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

函數(shù)定義

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

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

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

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

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

應用場景

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

為了解決上述場景的問題,我們可以在調(diào)用pthread_barrier_init()時指定n+1個等待,其中n是線程數(shù)。而在每個線程執(zhí)行函數(shù)的開始調(diào)用pthread_barrier_wait()。這樣主進程在調(diào)用pthread_create()創(chuàng)建子線程后,子線程運行到pthread_barrier_wait()后將被阻塞,線程都停下來等待最后一個pthread_barrier_wait()函數(shù)被調(diào)用。最后一個pthread_barrier_wait()函數(shù)由主進程或者其他子線程在它覺得合適的時候調(diào)用就行。最后這個pthread_barrier_wait()有點像跑步運動時的起步槍,只有最后這個pthread_barrier_wait()函數(shù)被調(diào)用,其他被阻塞的線程就能夠繼續(xù)運行。

使用實例

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

/*
********************************************************************************
*描述: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

//線程柵欄
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個等待

//創(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都阻塞住了,再運行主線程

//主線程調(diào)用pthread_barrier_wait()函數(shù)之后,已經(jīng)達到了
//pthread_barrier_init()函數(shù)設置的3個等待條件,此時調(diào)用
//pthread_barrier_wait()函數(shù)的主線程不會被阻塞,task1和
//task2也將繼續(xù)運行.
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);//延時3s
pthread_exit(NULL);
}

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

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

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







審核編輯:劉清

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

    關(guān)注

    4

    文章

    596

    瀏覽量

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

    關(guān)注

    0

    文章

    278

    瀏覽量

    20076

原文標題:Linux應用編程-pthread_barrier_xxx介紹

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

收藏 人收藏

    評論

    相關(guān)推薦

    多線程程之一: 問題提出

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

    多線程程之線程同步

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

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

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

    Linux下多線程機制

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

    Linux下多線程機制

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

    Linux多線程線程同步

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

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

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

    多線程程之Linux線程編程

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

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

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

    linux多線程之pthread用法

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

    linux多線程機制-線程同步

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

    Linux 多線程編程

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

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

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

    多線程不進行同步會造成什么問題

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

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

    多線程編程是一種并發(fā)編程的方法,意味著程序中同時運行多個線程,每個線程可獨立執(zhí)行不同的任務,共享同一份數(shù)據(jù)。由于多線程并發(fā)執(zhí)行的特點,會引發(fā)數(shù)據(jù)同步
    的頭像 發(fā)表于 11-17 14:22 ?1329次閱讀
    主站蜘蛛池模板: 年轻护士3的滋味 | 在线观看一区二区三区视频 | 国产女人18毛片水真多18精品 | 夜夜骑夜夜操 | 国产天天在线 | 亚洲综合久久久久久888 | 97色噜噜| 美女被免费网站视频在线 | 91精品日本久久久久久牛牛 | 日本美女搞黄 | 日韩精品卡4卡5卡6卡7卡 | 男女在线视频 | 四虎欧美| 艹逼视频免费看 | 韩日精品 | 四虎国产精品高清在线观看 | 色免费观看 | 色吧亚洲欧美另类 | 亚洲综合久久久久久888 | 欧美成人性色xxxxx视频大 | 永久免费品色堂 | 在线看片成人免费视频 | 成人午夜影院在线观看 | 欧美色综合高清视频在线 | 免费啪视频在线观看免费的 | se94se最新网站 | 国产成人高清一区二区私人 | 精品国产你懂的在线观看 | 亚洲a成人| 老子影院午夜精品欧美视频 | 国产国拍亚洲精品mv在线观看 | 国产色爽女 | 欧美精品aaa久久久影院 | 日本妈妈4 | 中文字幕在线视频第一页 | 国产午夜免费视频片夜色 | 又粗又大撑满了好爽 | 久久精品免费观看 | 在线观看精品国产入口 | 天天做天天爱天天爽综合区 | 人日人操|