0

バリア問題を解決するために、次の短いアプリケーションを作成しました。このアプリケーションは、同じスレッド メソッドを実行する 3 つの同一のスレッドがすべて共通のコード セクションで「出会う」ことを保証する必要があります。実行しましたが、問題ないようです。私の質問は:

1)それは正しいですか?

2) N スレッドに実装するための優先的で効率的な方法はありますか?

コードは次のとおりです。

static sem_t t_1_sem;

static sem_t t_2_sem;

static sem_t t_3_sem;



struct my_thread_info {
    int num;
};

void *thread(void *vargp)

{

        struct my_thread_info *info = (struct my_thread_info*)vargp;
        static int counter=0;
        counter++;

        if (info->num == 1) {
                printf("info->num=%d\n", info->num);
                if (counter<3)
                    sem_wait(&t_1_sem);   // down
                else {
                    sem_post(&t_2_sem);   // up
                    sem_post(&t_3_sem);   // up                 
                }

        } else 
            if (info->num == 2) {
                printf("info->num=%d\n", info->num);
             if (counter<3)             
                    sem_wait(&t_2_sem);             
                else {
                    printf("info->num=%d\n", info->num);
                    sem_post(&t_1_sem);
                    sem_post(&t_3_sem);    //up             
            }
            } 
            else  
            if (info->num == 3) {
                printf("info->num=%d\n", info->num);
             if (counter<3)             
                    sem_wait(&t_3_sem);             
                else {
                    sem_post(&t_1_sem);
                    sem_post(&t_2_sem);    //up             
            }
        }
        printf("meeting occured!\n");

}

int main()
{
    pthread_t tid0, tid1, tid2;

    struct my_thread_info info1, info2, info3;
    info1.num = 1;

    sem_init(&t_1_sem, 0, 0);
    sem_init(&t_2_sem, 0, 0);
    sem_init(&t_3_sem, 0, 0);

    pthread_create(&tid0, NULL, thread, &info1);
    info2.num = 2;

    pthread_create(&tid1, NULL, thread, &info2);

    info3.num = 3;
    pthread_create(&tid2, NULL, thread, &info3);


    pthread_join(tid0, NULL);
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);   
    pause();
    return 0;

}

よろしくケビン

4

2 に答える 2

0

まず第一に、あなたのcounter変数は保護されていません - 実行時に競合状態が発生する可能性がありますcounter++。ミューテックスを使用します。

N スレッドの実行に関しては、スレッド/セマフォの配列を使用することは IMO で許容されます。その設計を利用するコードがあり、うまく機能します。

于 2013-02-13T15:45:01.117 に答える
0

1.いいえ、正しくありません。のようなインクリメントをcounter++;行うと、競合状態が発生し、カウンターが適切にインクリメントされません。クリティカル セクションで囲みます。

2.

static pthread_mutex_t cs_mutex = PTHREAD_MUTEX_INITIALIZER;
static sem_t t_sem;

void *thread(void *vargp)
{
    static int counter=0;
    pthread_mutex_lock( &cs_mutex );
    counter++;
    pthread_mutex_unlock( &cs_mutex );

    if( counter == NO_THREADS )
        sem_post( &t_sem );

    sem_wait( &t_sem );
    sem_post( &t_sem );
}
int main( int argc, char *argv[] ){

    pthread_t tids[NO_THREADS];
    sem_init( &t_sem, 0, 0 );

    for( i=0; i<NO_THREADS; i++ ){
        pthread_create(&tids[i], NULL, thread, NULL);
    }

    for( i=0; i<NO_THREADS; i++ ){
        pthread_join(&tids[i], NULL);
    }
    pause();
    return 0;
}
于 2013-02-13T16:00:16.557 に答える