2

みんな。私はセマフォが初めてで、最近、バイナリセマフォを使用して簡単な問題を実装することを学んでおり、いくつか質問があります。

一度に 1 人だけが入ることができる面会室があります。たとえば、2 番目のキューの人がその部屋を訪れた後、次に部屋に入ろうとしている人は、1 番目のキューの人ではなく、3 番目のキューで待っている一番上の人です。総人数が表示されます。終了後は、スレッドを終了するだけです。

これを処理するために 3 つのセマフォを作成しようとしています。つまり、2 番目のキューに 1 人が入った後、2 番目のキューをブロックし、3 番目のキューにのみ「シグナル」を送信して続行します。などなど。ただし、コードにはいくつかの問題があります。ここでは、コードのセマフォ部分をいくつか示します。

メインのint:

sem_init(&mutex, 0, 1);

sem_init(&s0, 0, 1);

sem_init(&s1, 0, 1);

sem_init(&s2, 0, 1);

// 100 個の pthread を作成し、ランダムに queue0 または queue1 または queue2 に入れます

 for(int i = 0; i<num_thread; i++){ 

        pthread_t curr_thread;
        if(queueId == 0){
            queue0.push(curr_thread);           
        }else if(queueId == 1){ 
            queue1.push(curr_thread);   
        }else if(queueId == 2){ 
            queue2.push(curr_thread);   
        }
            pthread_attr_t attr;
            pthread_attr_init (&attr);
            pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
            pthread_create (&curr_thread, &attr, &thread_function, &queue_Num);
            pthread_attr_destroy (&attr);

    }

スレッド関数で:

void* thread_function (void* arg){

        sem_wait(&mutex);

        int n = *((int*) arg);
        if(n==0){
            sem_wait(&s0);
            cout << "person in queue" << n << " is visiting" << endl;
            sleep(1);
            if(!queue0.empty()){
                queue0.pop();
            }else{
                n++;
            }
            sem_post(&s1);

        }else if(n==1){
            sem_wait(&s1);
            cout << "person in queue" << n << " is visiting" << endl;
            sleep(1);
            if(!queue1.empty()){
                queue1.pop();
            }else{
                n++;
            }
            sem_post(&s2);
        }else if(n==2){
            sem_wait(&s2);
            cout << "person in queue" << n << " is visiting" << endl;
            sleep(1);
            if(!queue2.empty()){
                queue2.pop();
            }else{
                n++;
            }
            sem_post(&s0);
        }

        sem_post(&mutex);

    return NULL;
}

実際に実行すると、「デッドロック」に遭遇したようで、メインは毎回 2 つのスレッドのみを表示して終了しました。thread_function の設計に問題があるに違いないと思いました。それを指摘して修正する方法を教えてくれる人はいますか?よろしくお願いします。

4

1 に答える 1

0

をスレッドに渡すときqueueIdに、ローカル変数の 1 つへのポインターを渡したくありません。これは非常に迅速に変更されるためです。代わりに、整数自体をスレッドに渡す必要があります。

pthread_create(&curr_thread, &attr, &thread_function, (void*)queueId);
                                        // Pass queueId the int, not a pointer

次に、スレッドで値を読み取る必要がある場合は、void*バックを整数にキャストするだけです。

void* thread_function (void* arg){
    ...

    int n = (long)arg;

    ..
}

この後、あなたのコードは私にとってうまく機能します。

于 2012-12-06T00:25:36.623 に答える