[C] Process sync

Discussion in 'Programming' started by cvenko, Jun 12, 2012.

  1. #1
    Hello.

    My question is: why doesn't the spinlock in "shm1a" end, when i write data to *pomnilnik in "shm1b"?

    shm1a:
    #include <stdio.h>#include <stdlib.h>
    #include <sys/shm.h>
    #include <sys/sem.h>
    #include <errno.h>
    #include <sched.h>
    #include <string.h>
    #include <unistd.h>
    
    
    
    
    int main() 
    {
        int skupniPomnilnik;
        int skupniPomnilnik2;
        int* pomnilnik;
        char* pomnilnik2;
        int i;
    
    
        skupniPomnilnik = shmget(1059816, 1*sizeof(int), IPC_CREAT | IPC_EXCL | 0600);
        if(skupniPomnilnik < 0) 
        {
            perror("Napaka. Pomnilnik ni ustvarjen.");
            return(errno);
        }
    
    
        skupniPomnilnik2 = shmget(1059817, 20*sizeof(char), IPC_CREAT | IPC_EXCL | 0600);
        if(skupniPomnilnik2 < 0) 
        {
            perror("Napaka. Pomnilnik 2 ni ustvarjen.");
            return(errno);
        }
    
    
        pomnilnik = (int*)shmat(skupniPomnilnik, (void*)0, 0);
        if(pomnilnik == (int*)-1) 
        {
            perror("Ni kazalca!");
            return -1;
        }
    
    
        pomnilnik2 = (char*)shmat(skupniPomnilnik2, (void*)0, 0);
        if(pomnilnik2 == (char*)-1) 
        {
            perror("Ni kazalca!");
            return -1;
        }    
        
        *pomnilnik = 0;
    
    
        /* Spinlock*/
        while(*pomnilnik == 0)
        {
        }
    
    
        for(i=0; i<20; i++)
        {
            printf("%c\n",pomnilnik2[i]);
        }    
    
    
        shmdt(pomnilnik);
        shmdt(pomnilnik2);
    
    
        int brisi1;
        int brisi2;
    
    
        brisi1 = shmctl(skupniPomnilnik, IPC_RMID, 0);
        brisi2 = shmctl(skupniPomnilnik2, IPC_RMID, 0);
    
    
        if(brisi1 == 0) 
        {
            printf("Izbrisano!");
        } 
    
    
        if(brisi2 == 0) 
        {
            printf("Izbrisano!");
        } 
    
    
        return 0;
    }
    
    
    
    Code (markup):
    shm1b:
    #include <stdio.h>#include <stdlib.h>
    #include <sys/shm.h>
    #include <sys/sem.h>
    #include <errno.h>
    #include <sched.h>
    #include <string.h>
    #include <unistd.h>
    
    
    int main() 
    {
        int skupniPomnilnik;
        int skupniPomnilnik2;
        int* pomnilnik;
        char* pomnilnik2;
        int i;
    
    
        skupniPomnilnik = shmget(1059816, 0, 0);
        if(skupniPomnilnik < 0) 
        {
            perror("Napaka!");
            return(errno);
        }
    
    
        skupniPomnilnik2 = shmget(1059817, 0, 0);
        if(skupniPomnilnik2 < 0)
        {
            perror("Napaka!");
            return(errno);
        }
    
    
        pomnilnik = (int*)shmat(skupniPomnilnik, (void*)0, 0);
        if(pomnilnik == (int*)-1) 
        {
            perror("Ni kazalca!");
            return -1;
        }
    
    
        pomnilnik2 = (char*)shmat(skupniPomnilnik2, (void*)0, 0);
        if(pomnilnik2 == (void*)-1) 
        {
            perror("Ni kazalca!");
            return -1;
        }    
    
    
        for(i=0; i<20; i++)
        {
            pomnilnik2[i]='*';
        }    
        
        /* Stop spinlock */
        *pomnilnik = 1;    
    
    
        shmdt(pomnilnik);
        shmdt(pomnilnik2);    
    
    
        int brisi1;
        int brisi2;
    
    
        brisi1 = shmctl(skupniPomnilnik, IPC_RMID, 0);
        brisi2 = shmctl(skupniPomnilnik2, IPC_RMID, 0);
    
    
        if(brisi1 == 0) 
        {
            printf("Izbrisano!\n");
        } 
    
    
        if(brisi2 == 0) 
        {
            printf("Izbrisano!\n");
        } 
        return 0;
    }
    
    
    
    Code (markup):
     
    cvenko, Jun 12, 2012 IP