2016-11-30 9 views
0

나는 결혼 작전에 관한 프로젝트를 가지고 있습니다. 이 프로그램에서 등록자라는 스레드는 결혼 기능을 사용합니다. 이 결혼 생활에는 신부와 신랑이 있습니다. 결혼 기능은 신부 수와 신랑 수를 하나씩 줄입니다. 하지만 나는이 카운트를 줄이기 위해 문제가있다.Mulithread 프로그래밍의 가치 변경

는 pthread_create 부분에서 MAIN.C

#include<pthread.h> 
#include<stdlib.h> 
#include<stdio.h> 
#include<semaphore.h> 
#include "bride.h" 
#include "groom.h" 

pthread_t groomThread; 
pthread_t brideThread; 
sem_t registrarSemaphore; 
pthread_mutex_t lock; 

int *groomCount = 14; 
int *brideCount = 20; 
int *availableRegistrar; 

void createBride(int *brideCount) { 
    pthread_create(&brideThread, NULL, &increaseBrideCount, (void *) brideCount); 
} 

void createGroom(int *groomCount) { 
    pthread_create(&groomThread, NULL, &increaseGroomCount, (void *) groomCount); 
} 

void deleteGroom(int *groomCount) { 
    pthread_create(&groomThread, NULL, &decreaseGroomCount, (void *) groomCount); 
} 

void deleteBride(int *brideCount) { 
    pthread_create(&brideThread, NULL, &decreaseBrideCount, (void *) brideCount); 
} 


void marriage() { 
    sem_init(&registrarSemaphore, 0, 2); 

    while (1) { 
     sem_getvalue(&registrarSemaphore, &availableRegistrar); 

     printf("\nAvailable Registrar Number = %d\n", availableRegistrar); 

     printf("bride %d\n", brideCount); 
     printf("groom %d\n", groomCount); 

     if (brideCount > 0 && groomCount > 0) { 
      sem_wait(&registrarSemaphore); 
      sem_getvalue(&registrarSemaphore, &availableRegistrar); 
      printf("Available Registrar %d \n", availableRegistrar); 

      printf("Marriage Bride %d and Groom %d \n", brideCount, groomCount); 
      pthread_mutex_lock(&lock); 
      deleteBride(brideCount); 
      pthread_mutex_unlock(&lock); 
      //pthread_join(brideThread, &brideCount); 
      pthread_mutex_lock(&lock); 
      deleteGroom(groomCount); 
      pthread_mutex_unlock(&lock); 
      //pthread_join(groomThread, &groomCount); 
      printf("Exiting critical region...\n\n"); 
      /* END CRITICAL REGION */ 
      sem_post(&registrarSemaphore); 
     } 


     int random = rand() % 100; 
     if (random % 7 > 4) { 
      printf("Bride Created\n"); 
      pthread_mutex_lock(&lock); 
      createBride(brideCount); 
      //pthread_join(brideThread, &brideCount); 
      pthread_mutex_unlock(&lock); 

     } 

     if (random % 7 < 2) { 
      printf("Groom Created\n"); 
      pthread_mutex_lock(&lock); 
      createGroom(groomCount); 
      //pthread_join(groomThread, &groomCount); 
      pthread_mutex_unlock(&lock); 
     } 

     pthread_join(brideThread, &brideCount); 
     pthread_join(groomThread, &groomCount); 

     for (int i = 0; i < 100000000; i++); 
     printf("------------------------------"); 
    } 
} 

int main(void) { 
    marriage(); 
} 

, 당신이 볼 수있는 몇 가지 기능이있다. 그것은. h 부분에 정의됩니다. 예를 들어, bride.h에는 신부에 대한 두 가지 함수가 있습니다.

BRIDE.H

#ifndef BRIDE_H 
#define BRIDE_H 

void* increaseBrideCount(void * bride); 
void* decreaseBrideCount(void * bride); 

#endif 

BRIDE.C

#include <pthread.h> 
#include "bride.h" 


void* increaseBrideCount(void *bride){ 
    int brideCount = (int)bride; 
    brideCount++; 
    pthread_exit(brideCount); 
} 

void* decreaseBrideCount(void* bride){ 
    int brideCount = (int)bride; 
    brideCount--; 
    pthread_exit(brideCount); 
} 

메신저 새 신부를 만드는 동안, 난 함수에 신부의 새 값을 보내 질수. 예 :

나는 처음에는 20 명의 신부와 14 명의 신랑이있다. 2 명의 등록 기관을 보유하고 있습니다.

Marraige 않습니다. = 19

신부 수, 13

그런 다음, 내가 새 신부를 만들 = 신랑의 수입니다. 그것은 계산

은 = 1 :(임 다시 20을 만들려고로 이동합니다. 당신이 도움이 될 수있는 경우

, 나는 매우 행복 할 것입니다. 감사합니다

세마포어의 한을 확인하는 데 사용됩니다
+2

왜 새 스레드를 만들고 즉시 참여합니까? 그것은 말이되지 않습니다. –

+0

나는 pthread_join 함수가 쓰레드의 값을 리턴한다고 생각한다. ptread_create 함수는 거기에 가서 그것 (pthread_exit)을 반환하는 것보다 일을 않습니다. 나는 pthread_join과 phtread_exit 읽을 수 있습니다, 내가 잘못 : ( – Berkin

+0

하지만 한 스레드가 다른 스레드에 조인하면 전자는 후자를 완료 할 때까지 기다립니다. 후자와 함께 모든 작업을 수행하려고한다면, 후자의 스레드의 작업을 직접 수행 할 수도 있습니다. –

답변

2

이 경우 변경되는 것은 세마포어를 사용하여 "보호"할 필요가 있습니다.이 목적을 위해 세마포어를 만든 것으로 보입니다 (brideSemaphoregroomSemaphore)를 사용하면됩니다.

덧붙여서 : sema phore를 하나의 스레드에서만 사용하면 marriage()에 시간이 낭비됩니다 (registrarSemaphore의 경우가 될 것 같습니다). 어느 쪽이든 다른 장소에서 사용해야하거나 전혀 사용하지 않아야합니다.

+0

주문에 관한 것이 아닙니다. 세마포어를 적절히 사용하면 각 스레드가 다른 스레드의 쓰기 효과를 볼 수 있습니다. 스레드가 어떤 형태의 동기화없이 서로의 쓰기를 볼 수 없다는 사실은 사람들이 스레드로 문제를 일으키는보다 일반적인 현상 중 하나입니다. –

+0

답장을 보내 주셔서 감사합니다. 이 경우 2 명의 등록 기관이 있으므로 등록 기관 세마포를 사용합니다. 그것 중 하나는 결혼 할 수있는, 등록자 수 -; 그러나 나는 스레드를 사용하는 동안 문제가 있다고 생각합니다. (나는 하나의 스레드가 하나의 함수를 실행할 수 있음을 알고 있습니다. 내가 잘못 했나요? 그 목적을 위해 증가와 감소를 위해 스레드 두 개를 열었습니다.) 선생님은 신부와 신랑이 쓰레드가되고 쓰레드를 사용하여 이러한 작업을하려고하는 것 – Berkin

+2

뮤텍스 또한 가능합니다. –