[C] paralelne procesy a ich synchronizacia semaformi

Programovacie jazyky, rady, poradňa...
elessar
Expert
Expert
Príspevky: 174
Registrovaný: 22 aug 2005, 16:41

[C] paralelne procesy a ich synchronizacia semaformi

Príspevok od používateľa elessar »

Dobry den,
snazim sa pouzit semafory na jednoduchu synchronizaciu dvoch procesov, teda proces child vykona hlavnu vetvu ifu, kde sa zastavi na sem_wait(&mutex), takze pokracuje forknuty proces druhou vetvou, ktora najprv pripravi na odokmnutie semafor pre prvy proces, nastavi podmienku na ukoncenie nekonecneho cyklu (ktory kontroluje, ci je mutex otvoreny) a nakoniec odomkne mutex a semafor (vid kod)... Problem je v tom, ze nedojde k odomknutiu tohto mutexu (resp zvysi sa jeho hodnota, ale prvy proces "akoby o tom nevedel"). Snazil som sa to vyriesit aj pomocou zdielanej pamate, do ktorej by som ulozil semafory, ale nepomohlo..

Kód: Vybrať všetko

int main(int argc, char *argv[]) {
int value;
pid_t child;
child = fork();
sem_t semafor;
sem_t mutex;
sem_init(&semafor,0,0);
sem_init(&mutex,0,0);
int *counter;
key_t key1 = ftok(argv[0], 98); //vytvo�en� kl��e
int shmid1 = shmget(key1, sizeof(int), IPC_CREAT | 0666);
counter= shmat(shmid1, NULL, 0);
(*counter)=1;
setbuf(stdout,NULL);
if(child == 0)
  { //cast kodu vykonavana prvym procesom
      while(1)
        {
         fprintf(stdout,"tohle je if\n");
         sem_getvalue(&semafor, &value);
         fprintf(stdout,"The value of the semaphors is %d\n", value);
         sem_wait(&mutex); 
         sem_wait(&semafor);
         fprintf(stdout,"odemknul jsem semafor\n");
         if (*counter==0)   break;
        } //koniec
  } else
      {//cast kodu vykonavana druhym procesom
        fprintf(stdout,"odemknuto\n");
        sem_post(&semafor);
       *counter=0;
        sem_getvalue(&semafor, &value);
        sem_post(&mutex);
      }//koniec
}
Gregi
Light Star
Light Star
Príspevky: 224
Registrovaný: 24 mar 2005, 11:34

Re: [C] paralelne procesy a ich synchronizacia semaformi

Príspevok od používateľa Gregi »

Je to programovane na viacjadrovom procaku? Myslim i podpora viacadroveho CPU.
vid:

Kód: Vybrať všetko

Mutexs work with multiple threads or multiple processes. What you describe is not a problem if there are no other threads or processes that want access to the mutex at the same time. Add a Sleep() before the WaitForSingleObject() to allow time for other threads to gain access to the mutex and see if the wait function blocks until the other thread(s) have released the mutex.
elessar
Expert
Expert
Príspevky: 174
Registrovaný: 22 aug 2005, 16:41

Re: [C] paralelne procesy a ich synchronizacia semaformi

Príspevok od používateľa elessar »

2xIntel Xeon 5420 (Core2 Quad 2,5GHz/8MB) :)

nakoniec som posix semafory prepisal na starsie systemV a s nimi to ide...ale stale nerozumiem, v com bol problem

PS: nemyslim, ze by vobec bolo nutne viacjadrove CPU, kedze sysV vzniklo niekedy v 80.tych rokoch
Gregi
Light Star
Light Star
Príspevky: 224
Registrovaný: 24 mar 2005, 11:34

Re: [C] paralelne procesy a ich synchronizacia semaformi

Príspevok od používateľa Gregi »

No tak uz to vidim, prilis slabe zelezo na tu dopravu 8) .
Len som skusil, pretoze podobny problem mal ktosi v tej diskusii.
Napísať odpoveď