chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內不再提示

如何使用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的線程,
//調用該函數(shù)的線程會阻塞住,直到pthread_barrier_init()中指定
//數(shù)量的線程調用了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)建一個或者多個線程去完成不同功能的處理。子線程啟動之后,需要等待主進程完成基礎的配置之后各個子線程才能正常工作。所以這里就存在一個問題要解決,各個子線程如何等待主進程完成工作后,才繼續(xù)往下執(zhí)行呢?

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

使用實例

下面的程序,在main()函數(shù)中,pthread_barrier_init()指定2+1個等待,接著創(chuàng)建了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個等待

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

//主線程調用pthread_barrier_wait()函數(shù)之后,已經(jīng)達到了
//pthread_barrier_init()函數(shù)設置的3個等待條件,此時調用
//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);
}

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

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







審核編輯:劉清

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

    關注

    4

    文章

    605

    瀏覽量

    28589
  • 多線程
    +關注

    關注

    0

    文章

    279

    瀏覽量

    20433

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    多線程程之一: 問題提出

    進行多線程的程序設計,并提供了操作系統(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)資源移交給其他的線程使用,這樣調用pthread_crea
    發(fā)表于 09-26 09:36

    Linux下多線程機制

    1 線程不能獨立運行,要依附于進程2 如果創(chuàng)建一個子線程只需要重新分配??臻g3 多個線程可以并行運行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多線程常用相關函數(shù)簡介

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

    多線程程之Linux線程編程

    的可移植性。 (1)函數(shù)說明。 創(chuàng)建線程實際上就是確定調用該線程函數(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 ?6988次閱讀
    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 ?576次閱讀

    Linux 多線程編程

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

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

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

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

    背景問題:在特定的應用場景下,多線程不進行同步會造成什么問題? 通過多線程模擬多窗口售票為例: #include #include #include #include #include
    的頭像 發(fā)表于 11-13 11:40 ?1070次閱讀
    <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 ?1727次閱讀