Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <pthread.h>
- #include <unistd.h>
- #include <stdbool.h>
- #define NAZWA_PLIKU "buczko_mutexy.c"
- #define WIELKOSC_BUFORA 100
- #define ILOSC_WATKOW 3
- void* watek(void* arg);
- FILE *plik;
- char buffor[WIELKOSC_BUFORA];
- pthread_mutex_t mutexDostepDoBufora;
- volatile int czyBuforPelny = 0;
- volatile int czyZakonczonoOdczyt = 0;
- pthread_cond_t czyBufforNiepusty;
- pthread_t watki[ILOSC_WATKOW];
- pthread_attr_t atrybuty;
- int main() {
- plik = fopen(NAZWA_PLIKU , "r");
- if ( plik == NULL ) {
- fprintf(stderr, "Nie moge uzystakc dostepu do pliku.\n");
- return -1;
- }
- pthread_mutex_init(&mutexDostepDoBufora, NULL);
- pthread_cond_init(&czyBufforNiepusty, NULL);
- pthread_attr_init(&atrybuty);
- pthread_attr_setdetachstate(&atrybuty, PTHREAD_CREATE_DETACHED);
- bool bledyTworzeniaWatkow = false;
- for (int i = 0; i<ILOSC_WATKOW; i++)
- bledyTworzeniaWatkow |= pthread_create(&(watki[i]), &atrybuty, &watek, NULL);
- if ( bledyTworzeniaWatkow ) {
- fprintf(stderr, "Nie moge utworzyc watkow.\n");
- return -2;
- }
- do {
- pthread_mutex_lock(&mutexDostepDoBufora);
- if ( fgets(buffor,100, plik ) == NULL) {
- fclose(plik);
- czyZakonczonoOdczyt = 1;
- break;
- }
- czyBuforPelny = 1;
- pthread_cond_broadcast(&czyBufforNiepusty);
- pthread_cond_wait(&czyBufforNiepusty, &mutexDostepDoBufora);
- pthread_mutex_unlock(&mutexDostepDoBufora);
- } while (1);
- pthread_attr_destroy(&atrybuty);
- pthread_mutex_destroy(&mutexDostepDoBufora);
- return 0;
- }
- void* watek(void* arg)
- {
- pthread_t id = pthread_self();
- do {
- pthread_mutex_lock(&mutexDostepDoBufora);
- if(czyBuforPelny) {
- printf("%ld:%s", (long)id, buffor);
- czyBuforPelny = 0;
- pthread_cond_broadcast(&czyBufforNiepusty);
- } else {
- if ( czyZakonczonoOdczyt ) {
- pthread_mutex_unlock(&mutexDostepDoBufora);
- break;
- }
- pthread_cond_wait(&czyBufforNiepusty, &mutexDostepDoBufora);
- }
- pthread_mutex_unlock(&mutexDostepDoBufora);
- } while ( 1 );
- return NULL;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement