• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Synchronizacja wątków linux C

Ultraszybki serwer VPS NVMe BIZNES
0 głosów
65 wizyt
pytanie zadane 12 stycznia w C i C++ przez Łukasz Michalski Początkujący (350 p.)
#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?

1 odpowiedź

0 głosów
odpowiedź 12 stycznia przez j23 Nałogowiec (41,840 p.)
edycja 12 stycznia przez j23

Jeśli wszystkie wątki mają zapisywać tę samą linię, użyj zmiennej warunkowej i pthread_cond_broadcast() do sygnalizacji. Dla pewności można by dodać jakiś licznik, żeby wątek czytający poczekał, aż te trzy wątki zapiszą linie.

Podobne pytania

0 głosów
1 odpowiedź 56 wizyt
pytanie zadane 14 listopada 2017 w Systemy operacyjne, programy przez Gucci Początkujący (440 p.)
0 głosów
1 odpowiedź 68 wizyt
pytanie zadane 14 stycznia w Java przez nik Użytkownik (710 p.)
0 głosów
2 odpowiedzi 141 wizyt
Porady nie od parady
Nie wiesz jak poprawnie zredagować pytanie lub pragniesz poznać którąś z funkcji forum? Odwiedź podstronę Pomoc (FAQ) dostępną w menu pod ikoną apteczki.
Ciekawy innych porad? Odwiedź tę stronę!

44,296 zapytań

84,112 odpowiedzi

167,460 komentarzy

21,201 pasjonatów

Przeglądających: 149
Pasjonatów: 8 Gości: 141

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...