2016-11-22 8 views
0

Я пишу этот код в CТемы работать ненадо

#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; 
} 

И это дает результат:

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 

Вопрос заключается в том, что если второй поток проходит через sem_wait(&(currentCustomer->Cashiers[0])); Это означает sem_post(&(currentCustomer->Cashiers[0])); это уже произошло поэтому firstIsFree уже 1, так почему он печатает второй printf?

+1

Для чего вы хотите его одеть? ...;) – LPs

+0

@LPs не задал вопрос, новый в этой области, можете ли вы спросить об этом по-другому? –

+0

Ну. Это была шутка: [неприемлемо] (http://dictionary.cambridge.org/it/dizionario/inglese/initable). Я смотрю на ваш код. Я вернусь к тебе, если увижу что-нибудь. – LPs

ответ

2

Ниже в вашем коде присутствует проблема, которая может привести к неопределенному поведению. Пожалуйста, исправьте его и повторите попытку:

В вашей основной функции вы используете локальные переменные для семафоров first и second, и ваша основная функция, кажется, выходит, не дожидаясь выхода потоков. Вы должны иметь pthread_join вызовов в своей основной функции.

+0

где именно я должен называть pthread_join? –

+0

Добавьте цикл в основную функцию сразу после цикла pthread_create и вызовите pthread_join для всех созданных потоков. – Jay

+0

Вы совершенно правы, но нет риска _: это конкретное поведение. – LPs

 Смежные вопросы

  • Нет связанных вопросов^_^