linux多執行緒之屏障

2021-07-16 15:39:23 字數 2642 閱讀 1429

基本概念:

屏障(barrier)是使用者協調多個執行緒並行工作的同步機制。屏障允許每個執行緒等待,直到所有的合作執行緒都達到某一點,然後從該點繼續執行。

一、初始化與銷毀

pthread_barrier_destroy(p) posix programmer's manualpthread_barrier_destroy(p)

name

pthread_barrier_destroy, pthread_barrier_init - destroy and initialize

a barrier object (advanced realtime threads)

synopsis

#include int pthread_barrier_destroy(pthread_barrier_t *barrier);

int pthread_barrier_init(pthread_barrier_t *restrict barrier,

const pthread_barrierattr_t *restrict attr, unsigned count);

兩個函式的返回值:若成功,返回0;否則,返回錯誤編號初始化屏障時,可以使用count引數指定,在允許所有執行緒繼續執行之前,必須到達屏障的執行緒數目。屏障屬性attr設定為null表示使用預設屬性。

二、等待其他執行緒

pthread_barrier_wait(p)    posix programmer's manual   pthread_barrier_wait(p)

name

pthread_barrier_wait - synchronize at a barrier (advanced realtime

threads)

synopsis

#include int pthread_barrier_wait(pthread_barrier_t *barrier);

返回值:若成功,返回0或者pthread_barrier_serial_thread;否則,返回錯誤編號呼叫pthread_barrier_wait的執行緒在屏障技術count未滿足條件時,會進入休眠狀態。如果該執行緒是最後乙個呼叫pthread_barrier_wait的執行緒,就滿足了屏障計數,所有的執行緒都被喚醒。

對於乙個任意執行緒,pthread_barrier_wait函式返回pthread_barrier_serial_thread。剩下的執行緒看到的返回值是0。這使得乙個執行緒可以作為主線程,它可以工作在其他所有執行緒已完成的工作結果上。

三、屏障屬性

目前定義的屏障屬性只有程序共享屬性。

例子,功能是簡單計數,gcc pthread_barrier.c -pthread:

#include #include #include #include #include #include static int num1 = 0;

static int num2 = 0;

static int count1 = 10000000;

static int count2 = 20000000;

static pthread_barrier_t barrier;

void perror(const char *s)

long long getsystemtime()

void* fun2(void *arg)

long long t2 = getsystemtime();

printf("the thread2 num2 is %d, pay %lld ms\n", num2, (t2-t1));

pthread_barrier_wait(&barrier);

}int main()

err = pthread_detach(thread2);

if (err != 0)

int i = 1;

long long t1 = getsystemtime();

for (; i<=count1; ++i)

long long t2 = getsystemtime();

printf("the thread1 num1 is %d, pay %lld ms\n", num1, (t2-t1));

pthread_barrier_wait(&barrier);

long long t3 = getsystemtime();

printf("the thread1 get serial, num1+num2=%d, pay %lld ms\n", num1+num2, t3-t1);

pthread_barrier_destroy(&barrier);

return 0;

}

執行結果:

參考:《unix環境高階程式設計》·第三版

end;

Linux多執行緒之執行緒建立

1.函式 include intpthread create pthread t restrict thread,const pthread attr t restrict attr,void start routine void void restrict arg 引數 thread 為執行緒id...

Linux多執行緒之執行緒終止

呼叫 return void var 呼叫void pthread exit void value ptr 其它執行緒可以呼叫 pthread join 獲得這個針。注 如果 thread 執行緒通過 return 返回,value ptr 所指向的單元裡存放的是 thread 執行緒函式的返回值。...

linux多執行緒之自旋鎖

基本概念 何謂自旋鎖?它是為實現保護共享資源而提出一種鎖機制。其實,自旋鎖與互斥鎖比較類似,它們都是為了解決對某項資源的互斥使用。無論是互斥鎖,還是自旋鎖,在任何時刻,最多只能有乙個保持者,也就說,在任何時刻最多只能有乙個執行單元獲得鎖。但是兩者在排程機制上略有不同。對於互斥鎖,如果資源已經被占用,...