マルチスレッドを使用した生産者と消費者の問題の変形を書いています。キューを使用して、後で「消費」されるまで「生産された」アイテムを保存しようとしています。私の問題は、コンシューマー スレッドが実行されると、(キューの最も古いアイテムではなく) キューに追加された最新のアイテムのみを処理することです。さらに、そのアイテムを繰り返し処理します (キュー自体のアイテム数まで)。
私の問題は、アイテムをキューにプッシュするときにメモリを割り当てる必要があることだと思います (ただし、これについてはわかりません)。しかし、そのアイテムが消費されようとしているときに、このメモリを参照する方法が必要です。
とにかく、これは私のプログラムのペアダウンバージョンです。ここに投稿しているものは不完全です (これは無限ループです) が、この問題に関連する部分だけを表示しようとしています。関数 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;
}