Prtogramowanie c/ C++

Opis forum

  • Nie jesteś zalogowany.
  • Polecamy: Gry

#1 2012-01-27 06:41:12

bronek

Administrator

Zarejestrowany: 2012-01-03
Posty: 14
Punktów :   

source

#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

 

Stopka forum

RSS
Powered by PunBB
© Copyright 2002–2008 PunBB
Polityka cookies - Wersja Lo-Fi


Darmowe Forum | Ciekawe Fora | Darmowe Fora
www.1101bwgrupaa.pun.pl www.nakacu.pun.pl www.poke-batles.pun.pl www.ez20092010.pun.pl www.forumawf.pun.pl