#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/syscall.h>
char linia[100];
pthread_mutex_t muteks = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t muteks2 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t muteks3 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t muteks4 = PTHREAD_MUTEX_INITIALIZER;
//int pthread_mutex_init(pthread_mutex_t *muteks, const
// pthread_mutexattr_t *mutexattr);
pthread_t w1,w2,w3;
long unsigned int tid;
int ile_lini(){
char linia[100];
int x=0;
FILE *plik = fopen("michalski_mutex.c","r");
while(fgets(linia,100,plik)!=NULL){
x=x+1;
};
fclose(plik);
return x;
}
void zapis_do_pliku(char nazwa[10])
{int licznik=0,ilosc_lini;
ilosc_lini=ile_lini();
while(licznik<ilosc_lini){
pthread_mutex_lock(&muteks2);
FILE *plik2 = fopen(nazwa,"a");
tid=syscall(SYS_gettid);
//char id[10];
//sprintf(id,"%lu",tid);
//fputs(id,plik2);
fputs(linia,plik2);
printf("\nId: %lu Wyswietlam napis: %s",tid,linia);
fclose(plik2);
pthread_mutex_unlock(&muteks);
licznik++;
//sleep(1);
}
}
void *wywolanie_zapisu(void *arg)
{
int *tab = ((int *) arg);
char *nazwa;
if(tab[0]==1)
{//printf("\nOtrzymalem jedynke");
nazwa="Wynik1.txt";}
if(tab[0]==2)
{//printf("\nOtrzymalem dwojke");
nazwa="Wynik2.txt";}
if(tab[0]==3)
{//printf("\nOtrzymalem trojke");
nazwa="Wynik3.txt";}
zapis_do_pliku(nazwa);
}
void odczyt_pliku()
{
int licznik=0,ilosc_lini;
ilosc_lini=ile_lini();
FILE *plik = fopen("michalski_mutex.c","r"); //Odczyt z pliku
while(licznik<ilosc_lini){
usleep(500);
pthread_mutex_lock(&muteks);
pthread_mutex_lock(&muteks3);
fgets(linia,100,plik);
licznik=licznik+1;
pthread_mutex_unlock(&muteks2);
//usleep(50);
//pthread_mutex_unlock(&muteks2);
//usleep(50);
//pthread_mutex_unlock(&muteks2);
sleep(1);
};
fclose(plik);
}
int main()
{
remove("Wynik1.txt");
remove("Wynik2.txt");
remove("Wynik3.txt");
int nazwa1[1],nazwa2[1],nazwa3[1];
nazwa1[0]=1;
nazwa2[0]=2;
nazwa3[0]=3;
int ilosc_lini;
ilosc_lini=ile_lini();
pthread_attr_t atrybut;
pthread_attr_init(&atrybut);
pthread_attr_setdetachstate(&atrybut, PTHREAD_CREATE_JOINABLE);
pthread_mutex_lock(&muteks2);
pthread_create(&w1,&atrybut, &wywolanie_zapisu, &nazwa1);
pthread_create(&w2,&atrybut, &wywolanie_zapisu, &nazwa2);
pthread_create(&w3,&atrybut, &wywolanie_zapisu, &nazwa3);
odczyt_pliku();
return 0;
} //KONIEC
Aktualnie funkcja odczytu z pliku wykonuje się tyle samo razy co funkcja zapisu do pliku.
Chciałbym żeby funkcja zapisu wykonywała się trzy razy na jedno wykonanie funkcji odczytu. Czy da się to jakoś sensownie zrobić przy użyciu mutexów?