1

マルチスレッドを使用した生産者と消費者の問題の変形を書いています。キューを使用して、後で「消費」されるまで「生産された」アイテムを保存しようとしています。私の問題は、コンシューマー スレッドが実行されると、(キューの最も古いアイテムではなく) キューに追加された最新のアイテムのみを処理することです。さらに、そのアイテムを繰り返し処理します (キュー自体のアイテム数まで)。

私の問題は、アイテムをキューにプッシュするときにメモリを割り当てる必要があることだと思います (ただし、これについてはわかりません)。しかし、そのアイテムが消費されようとしているときに、このメモリを参照する方法が必要です。

とにかく、これは私のプログラムのペアダウンバージョンです。ここに投稿しているものは不完全です (これは無限ループです) が、この問題に関連する部分だけを表示しようとしています。関数 queue_push() と queue_pop() はよくテストされているので、そこに問題があるとは思いません。必要に応じてさらに投稿します。

私のコンシューマー スレッドが最新のキュー アイテムのみを処理する理由を誰かが理解できますか? ありがとうございました!

sem_t mutex;
queue q;

FILE* inputFPtr[10];

char host_in[BUFFERSIZE];
char host_out[BUFFERSIZE];

void* p(void* inputFile) {

    while (fscanf(inputFile, INPUTFS, host_in) > 0) 
    {
        sem_wait(&mutex);
        queue_push(&q, host_in); //this function pushes the hostname onto the back of the queue   
        fprintf(stdout, "Produced: %d) %s\n", i, host_in);
        sem_post(&mutex);        
     }

    fclose (inputFile);
}

void* c() {

    while (TRUE)
    {        
        sem_wait(&mutex);
        sprintf(hostname_out, "%s", (char *) queue_pop(&q));
        printf("%s\n", host_out);
        sem_post(&mutex);
    }

}

int main (int argc, char* argv[]) {

    int i;
    pthread_t *th_in[argc-2];
    pthread_t *th_out[2];

    for (i = 0; i < (argc-2); i++) {
        th_in[i] = (pthread_t *) malloc(sizeof(pthread_t)); 
        inputFPtr[i] = fopen(argv[i+1], "r");
        pthread_create (th_in[i], NULL, p, inputFPtr[i]);
    }

    for (i = 0; i < 2; i++) {
        th_out[i] = (pthread_t *) malloc(sizeof(pthread_t));
        pthread_create (th_out[i], NULL, c, null);
    }

    for (i = 0; i < (argc - 2); i++) {
        pthread_join(*th_in[i], 0);
        free(th_in[i]);
    }

    for (i = 0; i < (2); i++) {
        pthread_join(*th_out[i], 0);
        free(th_out[i]);
    }

    return EXIT_SUCCESS;
}
4

1 に答える 1

0

コードを投稿するのを忘れました。ただし、あなたの説明から、すべてのキュー メンバーが同じメモリ ブロックを指しているようです。これが、すべての pop が同じアイテムになる理由です。あなたの質問への答えはイエスです。アイテムごとにメモリを割り当て、「消費」された後に解放する必要があります。

より具体的な回答のためにいくつかのコードを投稿してみてください...

于 2013-02-25T19:50:09.923 に答える