2016-11-22 2 views
0

ich diesen Code in c schreibenThemen arbeiten unangemessen

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

typedef struct 
{ 
    int customerID; 
    int ticketNumber; 
    sem_t * freeCashiers; 
    sem_t Cashiers[2]; 
}Customer; 

int firstIsFree = 1; 
int secondIsFree = 1; 

void * buyTheTickets(void * data) 
{ 
    Customer * currentCustomer = (Customer *)data; 
    int ID = currentCustomer->customerID; 

    currentCustomer->ticketNumber = rand()%15+1; 

    sem_wait(currentCustomer->freeCashiers);  

    sem_wait(&(currentCustomer->Cashiers[0])); 

    if(firstIsFree) 
    { 
     firstIsFree = 0; 
     printf("First Cashier Sold %d Ticket To %d Customer\n",currentCustomer->ticketNumber,ID); 

     usleep(1000000); 
     firstIsFree = 1; 

     sem_post(&(currentCustomer->Cashiers[0])); 
     sem_post(currentCustomer->freeCashiers); 

     return 0; 
    } 

    sem_post(&(currentCustomer->Cashiers[0])); 

    sem_wait(&(currentCustomer->Cashiers[1])); 

    if(secondIsFree) 
    { 
     secondIsFree = 0; 
     printf("Second Cashier Sold %d Ticket To %d Customer\n",currentCustomer->ticketNumber,ID); 

     usleep(1000000); 
     secondIsFree = 1; 

     sem_post(&(currentCustomer->Cashiers[1])); 
     sem_post(currentCustomer->freeCashiers); 

     return 0; 
    } 
    sem_post(&(currentCustomer->Cashiers[1])); 
} 

int main() 
{ 
    int numberOfCustomers = 15; 
    sem_t * numberOfCashiers = (sem_t*)malloc(sizeof(sem_t)); 
    sem_init(numberOfCashiers,0,2); 
    sem_t first; 
    sem_t second; 
    sem_init(&first,0,1); 
    sem_init(&second,0,1); 

    for(int i=1;i<=numberOfCustomers;i++) 
    { 
     pthread_t * curTh = (pthread_t*)malloc(sizeof(pthread_t)); 
     Customer * curCu = (Customer *)malloc(sizeof(Customer)); 
     curCu->customerID = i; 
     curCu->freeCashiers = numberOfCashiers; 
     curCu->Cashiers[0] = first; 
     curCu->Cashiers[1] = second; 
     pthread_create(curTh,NULL,buyTheTickets,curCu);  
    } 

    pthread_exit(0); 
    return 0; 
} 

Und es gibt Ausgang:

First Cashier Sold 14 Ticket To 1 Customer 

Second Cashier Sold 2 Ticket To 2 Customer 

First Cashier Sold 13 Ticket To 3 Customer 

Second Cashier Sold 11 Ticket To 4 Customer 

First Cashier Sold 9 Ticket To 5 Customer 

Second Cashier Sold 11 Ticket To 6 Customer 

First Cashier Sold 2 Ticket To 7 Customer 

Second Cashier Sold 13 Ticket To 8 Customer 

First Cashier Sold 10 Ticket To 9 Customer 

Second Cashier Sold 2 Ticket To 10 Customer 

First Cashier Sold 3 Ticket To 11 Customer 

Second Cashier Sold 8 Ticket To 12 Customer 

First Cashier Sold 6 Ticket To 13 Customer 

Second Cashier Sold 5 Ticket To 14 Customer 

First Cashier Sold 9 Ticket To 15 Customer 

Die Frage ist, dass, wenn der zweite Thread nach sem_wait(&(currentCustomer->Cashiers[0])); geht es bedeutet sem_post(&(currentCustomer->Cashiers[0])); dies bereits geschehen also ist firstIsFree schon 1 also warum druckt es den zweiten druck?

+1

Für welche Gelegenheit möchten Sie es anziehen? ...;) – LPs

+0

@LPs hat die Frage nicht bekommen, neu in diesem Bereich, können Sie es anders fragen? –

+0

Gut. Es war ein Witz: [unangemessen] (http://dictionary.cambridge.org/it/dizionario/inglese/inappropriate). Ich sehe mir deinen Code an. Ich werde zu dir zurückkommen, wenn ich etwas sehe. – LPs

Antwort

2

Das folgende Problem ist in Ihrem Code vorhanden, was zu undefiniertem Verhalten führen kann. Bitte korrigieren Sie es und versuchen Sie die Ausführung erneut:

In Ihrer Hauptfunktion verwenden Sie lokale Variablen für die Semaphore first und second und Ihre Hauptfunktion scheint zu beenden, ohne auf die Threads zu warten. Sie müssen pthread_join Anrufe in Ihrer Hauptfunktion haben.

+0

Wo genau soll ich pthread_join aufrufen? –

+0

Fügen Sie eine Schleife in der Hauptfunktion direkt nach Ihrer pthread_create-Schleife hinzu und rufen Sie pthread_join für alle erstellten Threads auf. – Jay

+0

Sie haben völlig Recht, aber es gibt nicht das Risiko: es ist ein konkretes Verhalten. – LPs