0

我编写了以下简短的应用程序来解决障碍问题。此应用程序应保证运行相同线程方法的三个相同线程都将在公共代码部分“相遇”。我运行它,它似乎没问题。我的问题是:

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

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 回答
0

首先,你的counter变量是无人看管的——你在做的时候可能有竞争条件counter++。使用互斥锁;

至于做 N 个线程 - 使用线程/信号量数组是 IMO 可以接受的,我有使用该设计的代码并且效果很好。

于 2013-02-13T15:45:01.117 回答