C Language (99) 썸네일형 리스트형 thread create 함수 설명 `thread_create` 함수는 **철학자 스레드와 모니터 스레드를 생성하고 관리**하는 핵심 함수입니다. 단계별로 상세히 설명드리겠습니다:---### **1. 함수 구조 및 매개변수**```cint thread_create(t_center *center, pthread_mutex_t *forks)```- **`t_center *center`**: 철학자, 뮤텍스, 공유 데이터를 포함하는 중앙 제어 구조체입니다.- **`pthread_mutex_t *forks`**: 철학자들이 사용하는 포크(뮤텍스) 배열입니다.---### **2. 주요 동작 단계**#### **(1) 모니터 스레드 생성**```cpthread_t observer;if (pthread_create(&observer, NULL, &mo.. ft_usleep vs usleep int ft_usleep(size_t milliseconds){ size_t start; start = get_time(); while ((get_time() - start) milliseconds) usleep(500); return (0);}ft_usleep 함수와 usleep 함수의 주요 차이점은 다음과 같습니다:시간 단위:ft_usleep: 밀리초(milliseconds) 단위로 동작합니다1.usleep: 마이크로초(microseconds) 단위로 동작합니다12.구현 방식:ft_usleep: while 루프를 사용하여 지정된 시간 동안 대기합니다. 이는 더 정확한 타이밍 제어를 가능하게 합니다1.usleep: 시스템 호출을 통해 직접 프로세스를 일시 중지시킵니다12.정밀도:ft_usleep: g.. 포크락 수정 1. 초기 지연 시간 조정 (핵심 해결책) c// 기존 코드 if (philo->id % 2 == 1) ft_usleep(1); // 수정 코드 if (philo->id % 2 == 1) ft_usleep(philo->time_to_eat * 0.9); // 먹는 시간의 90%로 지연 원리:홀수 ID 철학자의 시작 지연을 먹는 시간의 90%로 설정짝수/홀수 철학자의 동작 타임라인을 명확히 분리포크 사용 경쟁을 효과적으로 방지2. 포크 획득 순서 개선 c// 포크 획득 함수 내부 수정 void take_forks(t_philo *philo) { if (philo->id % 2 == 0) { pthread_mutex_lock(philo->left_fork); pthread_mutex_lock(ph.. 철학자의 포크 할당 로직 설명 철학자의 포크 할당 로직 설명이 코드는 식사하는 철학자 문제에서 각 철학자에게 왼쪽/오른쪽 포크를 할당하는 핵심 로직입니다. 아래 단계별로 설명합니다.1. 기본 개념철학자: 원형 테이블에 앉아 있음 (철학자 0, 1, 2, ..., N-1)포크: 철학자 수(N)만큼 존재하며, 각 철학자는 양쪽 포크를 들어야 식사 가능할당 규칙:왼쪽 포크 → 자신의 인덱스(i)에 해당하는 포크오른쪽 포크 → 이전 철학자의 포크 (i-1), 단 철학자 0은 마지막 포크(N-1) 사용2. 3명의 철학자 예시포크 배열 text포크[0] 포크[1] 포크[2] ⬆ ⬆ ⬆ 철학자0 ─ 철학자1 ─ 철학자2 └───────────────┘ 각 철학자의 포크 할당철학자왼쪽 포크오른쪽 포크설명0포크포크원형 구조를 위해 마지막 포크 사.. 공유 뮤텍스를 사용하는 이유와 예시 모든 철학자 스레드가 동일한 뮤텍스 객체를 공유하여 자원 접근을 동기화하기 위해서 공유뮤텍스를 사용합니다.1. 출력 동기화 (write_lock)문제 상황2명의 철학자가 동시에 "철학자 A가 포크를 들다"와 "철학자 B가 먹기 시작하다"를 출력하려 함각자 서로 다른 뮤텍스를 사용할 경우:→ 두 출력이 겹쳐 "철학자 A가 포철학자 B가 먹기 시작하다크를 들다" 같이 깨짐 cPhilosopher A: lock(자신의 write_lock) → 출력 → unlock Philosopher B: lock(자신의 write_lock) → 출력 → unlock 해결 방법동일 뮤텍스를 공유할 경우:→ 출력이 순차적으로 발생 cPhilosopher A: lock(공유 write_lock) → 출력 → unlock Phi.. mutex 입금문제 이 코드는 멀티스레딩을 활용한 은행 계좌 입금 처리를 설명하는 예제입니다.여기서 pthread를 사용하여 두 개의 스레드가 동시에 입금을 수행하며, 뮤텍스(pthread_mutex_t)를 사용하여 경쟁 상태(Race Condition)를 방지합니다.🔹 1. 코드 개요초기 잔액 조회 (read_balance())두 개의 스레드 생성 (pthread_create()):하나는 300원 입금하나는 200원 입금두 스레드가 종료할 때까지 대기 (pthread_join())뮤텍스 제거 (pthread_mutex_destroy())최종 잔액 출력📌 목표:올바르게 동기화하면 입금 후 총 잔액은 500원 증가해야 함.뮤텍스를 사용하지 않으면 경쟁 상태(Race Condition)로 인해 값이 엉망이 될 수 있음.🔹.. eat 함수 🔹 1. 함수 개요void eat(t_philo *philo)t_philo *philo: 현재 식사하려는 철학자의 정보를 담은 구조체 포인터이 함수는 철학자가 포크를 집고 식사하는 과정을 처리합니다.🔹 2. 코드 분석 (예제와 함께)✅ 1. 오른쪽 포크를 집는다pthread_mutex_lock(philo->r_fork);print_message("has taken a fork", philo, philo->id);🔹 개념pthread_mutex_lock(philo->r_fork); → 오른쪽 포크(뮤텍스)를 잠금.print_message("has taken a fork", philo, philo->id); → 철학자가 포크를 집었다는 메시지를 출력.📌 예제철학자가 오른쪽 포크를 집는 과정:[Phil.. pthread_mutex_init NULL 초기화 pthread_mutex_init(&forks[i], NULL);는 POSIX 스레드(pthread)에서 뮤텍스(mutex)를 초기화하는 함수입니다. 이 호출을 하나씩 분석하고, 내부 동작, 옵션 설정, 사용 예제를 상세히 설명해 보겠습니다.🔹 1. pthread_mutex_init() 함수 개요int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);✅ 매개변수pthread_mutex_t *mutex → 초기화할 뮤텍스 객체의 주소const pthread_mutexattr_t *attr → 뮤텍스 속성(attribute) 지정 (기본값 사용 시 NULL)✅ 반환 값성공 시 0 반환실패 시 오류 코드 반환EINVAL .. 이전 1 2 3 4 ··· 13 다음