Nowe posty

Autor Wątek: Semafory/Pamięć współdzielona  (Przeczytany 5242 razy)

twardziel

  • Gość
Semafory/Pamięć współdzielona
« dnia: 2012-01-06, 14:27:18 »
Musze napisać taki program, może ktoś podpowiedzieć jak to w ogóle zacząć? Jak utworzyć 20 procesów?


Napisać program tworzący 20 procesów inkrementujących wartość
zmiennej całkowitej przechowywanej w pamięci współdzielonej.
Dostęp do pamięci synchronizowany ma być za pomocą semaforów

Ksanderon

  • Gość
Semafory/Pamięć współdzielona
« Odpowiedź #1 dnia: 2012-01-06, 15:37:05 »
http://m.jedynak.pl/systemy/watki-referat.pdf
http://pl.wikibooks.org/wiki/POSIX_Threads

Jesteś pewny, że mają to być "prawdziwe" procesy a nie zwykłe wątki(to jest bardzo zasadnicza różnica)? Prawdopodobnie wykorzystasz wątki typu detached i jeden mutex(semafor binarny). Całość powinna zmieścić się w 20 linijkach kodu. Jeśli jednak mają to być procesy to sprawa się troszkę komplikuje ale te dwa linki powinny ci i tak sporo pomóc.

twardziel

  • Gość
Semafory/Pamięć współdzielona
« Odpowiedź #2 dnia: 2012-01-06, 17:09:05 »
Dzięki.
Sam nie wiem, po prostu kazał zrobić i tyle więc jak pisze procesy to chyba procesy.

Ksanderon

  • Gość
Semafory/Pamięć współdzielona
« Odpowiedź #3 dnia: 2012-01-07, 11:53:39 »
prawdopodobnie potrzebujesz czegoś takiego:

#include 
#include
#include

unsigned int licznik;
pthread_mutex_t global_mutex;

void *thread_func()
{
sleep(1);
int i=0;
while(i<1000)
{
pthread_mutex_lock(&global_mutex);
licznik+=1;
pthread_mutex_unlock(&global_mutex);
i++;
}
return NULL;
}
int main(int argc, char **argv)
{
pthread_t  tid[2000];
int i=0;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&global_mutex, &attr);
licznik=0;
while(i<2000)
{
if(pthread_create(&tid[i], NULL, thread_func, (void *)NULL))
{
perror("pthread_create");
return 1;
}
printf("uruchomiono wątek: %u\\n",i+1);
pthread_detach(tid[i++]);
}
while(1)
{
pthread_mutex_lock(&global_mutex);
if(licznik==2000*1000) break;
pthread_mutex_unlock(&global_mutex);
}
pthread_mutex_destroy(&global_mutex);
printf("skończyłem\\n");
return 0;
}
gcc -Wall -o "%e" "%f" -pedantic -O2 -std=gnu99 -lpthread

twardziel

  • Gość
Semafory/Pamięć współdzielona
« Odpowiedź #4 dnia: 2012-01-10, 14:13:21 »
A czy nie może być coś takiego:

#include 
#include
#include
#include
#include
#include
#include

#define KEY 176523
#define MAX 10
static struct sembuf buf;

void podnies(int semid, int semnum)
{
buf.sem_num = semnum;
buf.sem_op = 1;
buf.sem_flg = 0;
if(semop(semid, &buf, 1) == -1)
{
perror("Podnoszenie semafora");
exit(1);
}
}
void opusc(int semid, int semnum)
{
buf.sem_num = semnum;
buf.sem_op = -1;
buf.sem_flg = 0;
if(semop(semid, &buf, 1) == -1)
{
perror("Opuszczenie semafora");
exit(1);
}
}
int main()
{
int i, j, shmid, semid, *buf ;
shmid = shmget(KEY, 5, IPC_CREAT | 0600);
buf = shmat(shmid, NULL, 0);

semid = semget(KEY, 2, IPC_CREAT | 0600);
semctl(semid, 0, SETVAL, (int)MAX);
semctl(semid, 1, SETVAL, (int)0);

for (i = 0; i < 20; i++)
{
if(fork() == 0)
{
semid = semget(KEY, 2, 0600);
shmid = shmget(KEY, 5, IPC_CREAT | 0600);
buf = shmat(shmid, NULL, 0);
opusc(semid, 0);
buf[1] = buf[1]++;
printf("Potomek: Zmienna wynosi: %d \\n",buf[1]);
podnies(semid, 1);
}
//semid = semget(KEY, 2, 0600);
//shmid = shmget(KEY, 5, IPC_CREAT | 0600);
//buf = shmat(shmid, NULL, 0);
opusc(semid, 1);
buf[1] = buf[1]++;
printf("Rodzic: Zmienna wynosi:  %d\\n", buf[1]);
podnies(semid, 0);
}


//wait(15);
return 0;
}
Synchronizacja działa tylko program się nie kończy

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Semafory/Pamięć współdzielona
« Odpowiedź #5 dnia: 2012-01-10, 15:31:59 »
Zakońccz proces potomka.

        if(fork() == 0)
        {
            semid = semget(KEY, 2, 0600);
            shmid = shmget(KEY, 5, IPC_CREAT | 0600);
            buf = shmat(shmid, NULL, 0);
            opusc(semid, 0);
            buf[1] = buf[1]++;
            printf("Potomek: Zmienna wynosi: %d \\n",buf[1]);
            podnies(semid, 1);

            exit(0); // <-- np. tutaj
        }
Inaczej potomek zacznie się mnożyć w pętli "for i"

twardziel

  • Gość
Semafory/Pamięć współdzielona
« Odpowiedź #6 dnia: 2012-01-10, 15:48:57 »
Teraz ok, dzięki