色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

如何使用pthread_barrier_xxx系列函數來實現多線程之間的同步?

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

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

函數定義

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

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

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

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

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

應用場景

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

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

使用實例

下面的程序,在main()函數中,pthread_barrier_init()指定2+1個等待,接著創建了2個線程,然后主進程延時6秒,之后調用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個等待

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

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

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

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

程序的運行結果如下圖所示:

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







審核編輯:劉清

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

    關注

    4

    文章

    593

    瀏覽量

    27392
  • 多線程
    +關注

    關注

    0

    文章

    278

    瀏覽量

    19943

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

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

收藏 人收藏

    評論

    相關推薦

    多線程程之一: 問題提出

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

    多線程程之線程同步

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

    線程的分離狀態 pthread

    pthread_create函數返回之前就終止了,它終止以后就可能將線程號和系統資源移交給其他的線程使用,這樣調用pthread_crea
    發表于 09-26 09:36

    Linux下多線程機制

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

    Linux下多線程機制

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

    Linux多線程線程同步

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

    linux多線程常用相關函數簡介

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

    多線程程之Linux線程編程

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

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

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

    linux多線程之pthread用法

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

    linux多線程機制-線程同步

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

    Linux 多線程編程

    的區別, 創建完了就都是一樣的獨立個體創建完子線程之后,兩個線程之間獨立運行,線程的執行先后次序由OS的調度算法決定線程之間相互獨立也相互影響,因為主
    發表于 04-02 14:49 ?633次閱讀

    PyQT5+OpenCV多線程協作演示

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

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

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

    多線程如何保證數據的同步

    多線程編程是一種并發編程的方法,意味著程序中同時運行多個線程,每個線程可獨立執行不同的任務,共享同一份數據。由于多線程并發執行的特點,會引發數據同步
    的頭像 發表于 11-17 14:22 ?1220次閱讀
    主站蜘蛛池模板: 欧美ZC0O人与善交的最新章节| 久久久久九九| 韩国和日本免费不卡在线| 国产人妻人伦精品熟女麻豆| 国产亚洲色婷婷久久精品99| 久久久久综合| 暖暖 日本 视频 在线观看免费| 欧美一级黄色影院| 无人区乱码1区2区3区网站| 偷拍国产精品在线播放| 手机在线观看mv网址| 国产婷婷一区二区在线观看| 成人免费公开视频| 亚洲高清在线视频| 日本久久久久亚洲中字幕| 99热在线视频| 小寡妇好紧进去了好大看视频 | 99热久久视频只有精品6国产| 欧美人禽Zozo动人物杂交| 国产国拍亚洲精品永久软件| 在线视频 国产 日韩 欧美| 一本之道高清在线3线观看| 国产在线观看91精品| 97人妻精品全国免费视频| 欧洲美女人 一级毛片| 国产综合自拍 偷拍在线| TIMI1TV天美传媒在线观看| 亚洲一区二区免费看| 午夜亚洲国产理论片二级港台二级| 欧美视频毛片在线播放| 高h肉文np| 白丝女仆被强扒内裤| 无人影院在线播放| 欧美色图14p| 国内精品久久久久久久试看| 最新国产在线视频在线| 亚洲裸舞 hd| 特污兔午夜影视院| 欧洲videosdesrxotv| 免费在线观看国产| 美女逼逼毛茸茸|