在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); }
程序的運行結果如下圖所示:
審核編輯:劉清
-
Linux系統
+關注
關注
4文章
593瀏覽量
27392 -
多線程
+關注
關注
0文章
278瀏覽量
19943
原文標題:Linux應用編程-pthread_barrier_xxx介紹
文章出處:【微信號:嵌入式那些事,微信公眾號:嵌入式那些事】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論