#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; }
|