pthread_atfork 함수 - 다중 루틴 프로그램 fork에서 서로 밀어냄 처리

4314 단어
만약 다중 루틴 프로그램의 어떤 루틴이 포크 함수를 호출한다면, 새로 만든 하위 프로세스는 부모 프로세스와 같은 수량의 루틴을 자동으로 만들 수 있습니까?답은 아닙니다. 하위 프로세스는 실행 루트만 가지고 있습니다. 포크를 호출한 루트의 완전한 복사입니다.또한 하위 프로세스는 부모 프로세스에서 서로 잠긴 상태를 자동으로 계승합니다.즉, 부모 프로세스에 잠긴 상호 배척 자물쇠도 하위 프로세스에 잠겨 있다는 것이다.이로 인해 문제가 발생했습니다. 하위 프로세스는 부모 프로세스에서 계승된 상호 배척 잠금의 구체적인 상태를 알지 못할 수도 있습니다. (잠금을 추가하거나 잠금을 해제하는 상태는 알 수 없습니다.)이 상호 배척 자물쇠는 잠겼을 수도 있지만, 포크 함수를 호출한 그 노드가 잠긴 것이 아니라 다른 노드가 잠긴 것이다.만약 이 경우, 하위 프로세스가 이 상호 배척 자물쇠에 대해 다시 잠금 동작을 실행하면 잠금이 사라집니다.
멀티스레드 프로그램에서 fork 함수를 호출하면 잠금이 해제될 수 있습니다. 예:
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <wait.h>

pthread_mutex_t mutex;

void* another(void*arg)
{
    printf("    ,     
"
); pthread_mutex_lock(&mutex); sleep(5); pthread_mutex_unlock(&mutex); } int main() { pthread_mutex_init(&mutex, NULL); pthread_t id; pthread_create(&id, NULL, another, NULL); /* mutex, sleep(1)*/ sleep(1); int pid = fork(); if(pid < 0) { pthread_join(id, NULL); pthread_mutex_destroy(&mutex); return 1; } else if(pid == 0)// { printf(" ,
"
); /* mutex , , pthread_mutex_lock , */ pthread_mutex_lock(&mutex); printf(" 。。。。
"
); pthread_mutex_unlock(&mutex); exit(0); } else { wait(NULL); } pthread_join(id, NULL); pthread_mutex_destroy(&mutex); return 0; }

pthread_atfork 함수
pthread는 전문적인 함수를 제공합니다 pthreadatfork (), fork 호출 후 부모 프로세스와 자금성이 명확하게 잠겨 있는지 확인합니다.함수는 다음과 같이 정의됩니다.
#include <pthread.h>
int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));

이 함수는 상호 배척 자물쇠 상태를 정리하는 데 도움을 줄 세 개의 포크 핸들을 만들 것입니다.prepare 핸들은 fork 호출을 통해 하위 프로세스를 만들기 전에 실행됩니다. 모든 부모 프로세스의 상호 배척 자물쇠를 잠글 수 있습니다.parent 핸들은 fork 호출이 하위 프로세스를 만든 후에 fork가 되돌아오기 전에 부모 프로세스에서 실행됩니다.그것의 작용은prepare 핸들에 잠긴 모든 상호 배척 자물쇠를 방출하는 것이다.child 핸들은 fork가 되돌아오기 전에 하위 프로세스에서 실행됩니다.parent 핸들과 마찬가지로,child 핸들도prepare 핸들에 잠긴 상호 배척 자물쇠를 방출하는 데 사용됩니다.
함수가 성공적으로 0을 반환했고 오류가 오류 코드를 반환했습니다.
위 프로그램에서 pthread 사용atfork 함수
fork 호출 전에 다음 코드를 추가합니다.
void prepare()
{
    pthread_mutex_lock(&mutex);
}

void infork()
{
    pthread_mutex_unlock(&unlock);
}

pthread_atfork(prepare, infork, infork);

Linux 고성능 서버 프로그래밍 학습 노트

좋은 웹페이지 즐겨찾기