나는 결혼 작전에 관한 프로젝트를 가지고 있습니다. 이 프로그램에서 등록자라는 스레드는 결혼 기능을 사용합니다. 이 결혼 생활에는 신부와 신랑이 있습니다. 결혼 기능은 신부 수와 신랑 수를 하나씩 줄입니다. 하지만 나는이 카운트를 줄이기 위해 문제가있다.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(®istrarSemaphore, 0, 2);
while (1) {
sem_getvalue(®istrarSemaphore, &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(®istrarSemaphore);
sem_getvalue(®istrarSemaphore, &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(®istrarSemaphore);
}
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을 만들려고로 이동합니다. 당신이 도움이 될 수있는 경우
, 나는 매우 행복 할 것입니다. 감사합니다
세마포어의 한을 확인하는 데 사용됩니다
왜 새 스레드를 만들고 즉시 참여합니까? 그것은 말이되지 않습니다. –
나는 pthread_join 함수가 쓰레드의 값을 리턴한다고 생각한다. ptread_create 함수는 거기에 가서 그것 (pthread_exit)을 반환하는 것보다 일을 않습니다. 나는 pthread_join과 phtread_exit 읽을 수 있습니다, 내가 잘못 : ( – Berkin
하지만 한 스레드가 다른 스레드에 조인하면 전자는 후자를 완료 할 때까지 기다립니다. 후자와 함께 모든 작업을 수행하려고한다면, 후자의 스레드의 작업을 직접 수행 할 수도 있습니다. –