2017-04-15 3 views
0

Ich habe ein Projekt von meiner Universität für kritische Abschnitt Problem von n Prozessen. Ich habe einen Code für 2 Prozesse in c gemacht. Aber ich konnte nicht herausfinden, wie man es für den n-Prozess funktioniert. Der Code ist in C für Linux-Threads.Wie man einen Code für kritische Abschnitte in c für n Prozesse erstellt (Bakery Algorithmus)

Hier ist Code für 2 Prozesse.

#include <stdio.h> 
#include <pthread.h> 
#include <stdlib.h> 

int flag[2]; 
int turn; 
const int MAX = 1e9; 
int ans = 0; 


void lock_init(){ 
    flag[0]=flag[1]=0; 
    turn = 0; 
} 

void lock(int self){ 
    flag[self]=1; 
    turn = 1-self; 

    while(flag[1-self]==1 && turn == 1-self); 
} 

void unlock(int self){ 
    flag[self]=0; 
} 

void* func(void *s){ 
    int i=0; 
    int *limitptr = (int*) s; 
    int self = *limitptr; 
    printf("Thread %d in queue for critical section\n",self); 

    lock(self); 

    printf("Thread %d in critical section\n",self); 
    for(i=0;i<MAX;i++){ 

     ans++; 

    } 
    printf("Thread %d done counting\n",self); 
    printf("Thread %d is exiting critical section\n",self); 
    unlock(self); 
} 

int main(){ 

    pthread_t p1, p2; 
    int a=0,b=1; 
    lock_init(); 

    pthread_create(&p1, NULL, func, &a); 
    pthread_create(&p2, NULL, func, &b); 

    pthread_join(p1, NULL); 
    pthread_join(p2, NULL); 

    printf("Exiting Main\n"); 
    return 0; 
} 

Jede Hilfe wäre willkommen. Danke. :)

+0

Siehe https://en.wikipedia.org/wiki/Peterson % 27s_algorithm – 4386427

+0

oder https://en.wikipedia.org/wiki/Lamport%27s_bakery_algorithm – 4386427

+0

Siehe auch: http://stackoverflow.com/questions/11588514/a-test-implementation-of-peterson-lock-algorithm – ninjalj

Antwort

0

Verwendung ein mutex

#include <pthread.h> 

erklären die Mutex wie so:

pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER; 

dann zu Beginn eines kritischen Abschnitt Aufruf:

pthread_mutex_lock(&myMutex); 

und am Ende des kritischen Abschnitts Anruf:

pthread_mutex_unlock(&myMutex); 

es spielt keine Rolle, wie viele Threads, dass die kritischen Abschnitt verwenden, wird nur ein Thread der Lage sein, auf ihn zugreifen zu einer Zeit

-1

danken Ihnen für Ihre wertvolle Zeit und Antworten. Ich fand eine Lösung für mein Problem und Gedanken des Teilens it.I Implementiert Bäckerei Algorithmus C.

#include <stdio.h> 
#include <pthread.h> 
#include <stdlib.h> 

#define TRUE 1 
#define FALSE 0 

int N; 
int global = 10; 
int entering[100]; 
int number[100]; 

int max(int number[100]) { 
    int i = 0; 
    int maximum = number[0]; 
    for (i = 0; i < N; i++) { 
     if (maximum < number[i]) 
      maximum = number[i]; 
     } 
    return maximum; 
    } 

void lock(int i) { 
    int j = 0; 
    entering[i] = TRUE; 
    number[i] = 1 + max(number); 
    entering[i] = FALSE; 
    for (j = 0; j < N; j++) { 
     while (entering[j]); 
     while (number[j] != 0 && (number[j] < number[i] || (number[i] == number[j]) && j < i)) {} 
    } 
} 

void unlock(int i) { 
    number[i] = 0; 
} 

void *fn(void *integer) { 
    int i = (int) integer; 
    lock(i); 
    printf("\n\n-----------Process %d---------",i); 
    printf("\nProcess %d is Entering Critical Section\n",i); 
    global++; 
    printf("%d is the value of global \n",global); 
    printf("Process %d is leaving Critical Section\n",i); 
    printf("----------------------------------\n\n"); 
    unlock(i); 
}  


int main() 
{ 
    printf("Enter Number of Process\n"); 
    scanf("%d",&N); 
    int th[N]; 
    void *fn(void *); 
    pthread_t thread[N]; 
    int i = 0; 
    for (i = 0; i < N; i++) { 
     th[i] = pthread_create(&thread[i], NULL, fn, (void *)i); 
     pthread_join(thread[i], NULL); 
    } 
    return EXIT_SUCCESS; 
} 

Wieder Danke :)

+0

dies Bei der Antwort wird nur ein einzelner Thread zu einem bestimmten Zeitpunkt ausgeführt. Daher ist kein "kritischer" Abschnitt erforderlich. Daher ist dies keine gute Antwort. da es kein gutes kritisches Abschnittbeispiel zeigt. – user3629249

Verwandte Themen