Opis forum
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h> // zainkludowanie biblioteki
#include <queue>
using namespace std;
// dwa watki - jeden odczytuje z pliku tekstowego znak po znaku
// drugi wyswietla odczytane dane na ekranie
// oba watki dzialaja do momentu odczytania i wyswietlenia calego pliku
// watek wyswietlajacy dane powiniene wyswietlac je co 100 ms
#define SIGNS_TO_READ = 5;
pthread_t reader;
pthread_t writer;
int finishRead = 1;
int finishWrite = 1;
pthread_mutex_t finishCreatedMutex;
pthread_cond_t finishTreshold;
pthread_mutex_t fifoMutex;
queue<char> fifo;
FILE *fp;
void openFile() {
/* używamy metody wysokopoziomowej - musimy mieć zatem identyfikator pliku, uwaga na gwiazdkę! */
if ((fp = fopen("czytaj.txt", "r")) == NULL) {
printf("Nie mogę otworzyć pliku czytaj.txt do odczytu!\n");
exit(1);
} else {
printf("Otworzono plik");
}
}
void waitingMutex() {
pthread_cond_wait(&finishTreshold, &finishCreatedMutex);
}
void sendSignal() {
pthread_cond_signal(&finishTreshold);
}
void *read(void* data) {
char ch;
while (1) {
int count = 0;
while (count < 2) {
count++;
ch = fgetc(fp);
pthread_mutex_lock(&fifoMutex);
if (ch != EOF)
fifo.push(ch);
pthread_mutex_unlock(&fifoMutex);
}
waitingMutex();
if (ch == EOF) {
printf("Zamkniecie pliku\n");
fclose(fp);
break;
}
}
printf("Zakonczenie 1 watku\n");
finishRead = 0;
pthread_exit(NULL);
}
void *write(void* data) {
printf("Watek 2 rozpoczyna dzialanie\n");
char z;
while (finishRead) {
usleep(100000);
pthread_mutex_lock(&fifoMutex);
while (fifo.size() != 0) {
z = fifo.front();
fifo.pop();
cout << z << endl;
}
pthread_mutex_unlock(&fifoMutex);
sendSignal();
}
printf("Zakonczenie 2 watku");
pthread_exit(NULL);
}
void createThreads() {
pthread_mutex_init(&finishCreatedMutex, NULL);
printf("\nCreate thread\n");
int rc;
rc = pthread_create(&reader, NULL, read, NULL);
if (rc) {
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
usleep(100000);
printf("\nDrugi\n");
rc = pthread_create(&writer, NULL, write, NULL);
if (rc) {
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
void joinThread() {
pthread_join(reader, NULL);
pthread_join(writer, NULL);
}
int main(void) {
printf("Program start\n");
openFile();
createThreads();
joinThread();
return 0;
}
Offline