バリア同期バリア同期

このシナリオのためのバリア同期:一般的に、各タスクを完了するために、N個のスレッドで構成さNの作業を完了しなければならない作業を行う前に。

相関関数:
(pthread_barrier_t *バリア、int型のpthread_barrier_init
                         のconst pthread_barrierattr_t * attrの、制限
                         符号なしCOUNTを);
COUNTパラメータが0より大きくなければなりません、あなたがスレッドを同期したい番号を指定します。すべてのスレッドがpthread_barrier_wait実行された場合にのみ 、後に、彼らはpthread_barrier_waitから戻ることができます。

pthread_barrier_wait:現在のスレッドの同期は、オブジェクトの障壁を同期させます。バリアがで実行されたときにpthread_barrier_wait達するのスレッド数設定値、スレッドは他のスレッドを与えるPTHREAD_BARRIER_SERIAL_THREAD戻り値、0の戻り値を取得しました。バリアオブジェクトは、最後の初期状態にリセットされます。


障壁は、


いくつかの並列計算を続行する前に特定の時点で「会う」する必要があります。これは、当然のことながら、セマフォを用いて達成することができるが、他の構築物は、多くの場合、より便利である:障壁(のpthreadsライブラリpthread_barrier_t)。動機付けの例として、このプログラムを取る:


の#define _XOPEN_SOURCE 600


の#include <pthread.hの>
する#include <STDLIB.H>
する#include <stdio.hの>




に#define ROWS 10000件
の#define COLS 10000件
の#defineスレッド10


ダブルinitial_matrix [ROWS ] [COLS]。
ダブルfinal_matrix [ROWS] [COLS]。
//バリア変数
pthread_barrier_tのバール。


externボイドドット積(INT行、INT COL、
                       二重ソース[ROWS] [COLS]を、
                       二重先[ROWS] [COLS])。
EXTERN二重決定基(二重行列[ROWS] [COLS])。


ボイド* entry_point(ボイド*引数)
{
    int型のランク=(INT)引数。
    (;行<(ランク+ 1)* THREADS; INT行=ランク* ROWS /スレッド++行)のために
        のために(INT COL = 0、COL <COLS; ++ COL)
            ドット積(行、列、initial_matrix、final_matrix) ;


    //同期ポイント
    int型RC = pthread_barrier_wait(&バール)。
    もし(!RC = 0 && RC = PTHREAD_BARRIER_SERIAL_THREAD)
    {
        のprintf( "バリアに待つことができませんでした\ n"は);
        出口(-1)。
    }


    (INT行=ランク* ROWS /スレッド、行<(ランク+ 1)* THREADS; ++行)のために
        (INT COL = 0、COL <COLS; ++ COL)のための
            ドット積(行、列、final_matrix、initial_matrix)。
}


int型のmain(int型ARGC、チャー** ARGV)
{
    がpthread_t THR [THREADS]。


    //バリア初期化
    (pthread_barrier_init(&バール、NULL、スレッド))なら
    、{
        のprintf( "バリアを作成できませんでした\ n");
        -1を返します。
    }


    (iは0 = INT; I <THREADS; ++ i)に対する
    {
        IF(のpthread_create(&THR [i]は、NULL、&entry_point、(ボイド*)は、i))
        {
            のprintf( "スレッド%dを作成できませんでした\ n"は、 私);
            -1を返します。
        }
    }


    I <THREADS; iが0 = INT(のために、
    {
        IF(pthread_joinを(THR [i]は、NULL))
        {
            のprintf( "スレッド%dの\ nは参加できませんでした"、I)。
            -1を返します。
        }
    }


    ダブルDET =決定基(initial_matrix)。
    printf( "の行列M ^ 4 =%F \ n"は、DET)。


    0を返します。
}
このプログラムは、スポーン行列乗算の計算部分にそれぞれ割り当てスレッド数、。別の行列乗算:各スレッドは、次の段階で、その演算結果を使用します。


ここで注意すべき点がいくつかあります。


上部のバリア宣言
メインにおけるバリア初期化
仕上げにそのピアーの各スレッドが待機ポイント。


原文链接:http://pages.cs.wisc.edu/~travitch/pthreads_primer.html

发布了9 篇原创文章 · 获赞 4 · 访问量 1万+

おすすめ

転載: blog.csdn.net/juan190755422/article/details/41748463