fork 및 다중 스레드

만약 다중 루틴 프로그램이 fork를 호출한다면, 새로 만든 하위 프로세스는 실행 루틴 (fork를 호출한 그 루틴의 완전한 복사) 만 가지고 있으며, 하위 프로세스는 자동으로 부 프로세스의 호출 잠금 (조건 변수) 상태를 계승합니다. 즉, 부 프로세스에 잠긴 호출량은 하위 프로세스에서도 잠겨 있습니다.그래서 하위 프로세스는 계승된 상호 배척량의 구체적인 상태를 모른다. 만약에 상호 배척량이 fork 전에 이미 잠겼다면 하위 프로세스가 다시 상호 배척량에 잠그면 반드시 사라진다.물론 포크 후의 하위 프로세스가 exec () 를 즉시 호출하여 다른 프로그램을 실행하면 부자 관계를 차단할 수 없습니다.
         pthread_atfork는 자물쇠 상태를 지울 수 있습니다. fork가 호출된 후 부자 프로세스가 모두 지워진 자물쇠 상태를 가지고 있는지 확인할 수 있습니다.int pthread_atfork(void(*prepare)(void),void(*parent)(void),void(*child)(void));포크 핸들 세 개를 만들어서 배척량의 상태를 정리합니다.prepare 핸들은 포크 시스템이 호출되기 전에 모든 부모 프로세스의 배척 자물쇠를 잠그는 데 사용됩니다.parent는 포크가 하위 프로세스를 만든 후에 포크가 돌아오기 전에 부모 프로세스에서 prepare에 잠긴 배척량을 모두 실행합니다.child 핸들은 포크가 돌아오기 전에 하위 프로세스에서 실행되며, 포크 핸들에 잠긴 배척 자물쇠를 모두 방출합니다.다중 스레드가 포크를 호출할 때 사용할 수 있으며, 단일 스레드 포크나 exec라면 이걸 사용할 필요가 없습니다.
그리고 부모 프로세스가 만든 대상인 하위 프로세스는 마지막에 대상이 두 번 분석되면 구조와 분석은 쌍으로 나타나지 않는다.만약 대상이 RAII 기법으로 봉인된 어떤 자원이라면, 예를 들어 타이머 서브프로세스는 계승되지 않고, RAII 대상은 서브프로세스의 분석에 존재하지 않는 자원을 방출하려고 시도할 수 있다.그래서 다중 스레드에서는 가능한 한 포크 호출을 하지 마세요.
4
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <wait.h>

pthread_mutex_t mutex;

void* another( void* arg )//    
{
    printf( "in child thread, lock the mutex
" ); pthread_mutex_lock( &mutex ); sleep( 5 );//###1### pthread_mutex_unlock( &mutex ); } void prepare()//pthread_atfork { pthread_mutex_lock( &mutex ); } void infork() { pthread_mutex_unlock( &mutex ); } int main() { pthread_mutex_init( &mutex, NULL ); pthread_t id; pthread_create( &id, NULL, another, NULL ); //pthread_atfork( prepare, infork, infork );// fork pthread_atfork , ###2### sleep( 1 );// int pid = fork(); if( pid < 0 ) { pthread_join( id, NULL ); pthread_mutex_destroy( &mutex ); return 1; } else if( pid == 0 ) { printf( "I am in the child, want to get the lock
" ); pthread_mutex_lock( &mutex );// , ###1###, printf( "I can not run to here, oop...
" ); pthread_mutex_unlock( &mutex ); exit( 0 ); } else { pthread_mutex_unlock( &mutex ); wait( NULL ); } pthread_join( id, NULL ); pthread_mutex_destroy( &mutex ); return 0; }
pthread를 호출하지 않음atfork##2##### 출력:
in child thread, lock the mutex I anm in the child, want to get the lock ^C//잠금 해제, 중단됨
pthread 호출atfork##2#### 주석이 없는 출력:
in child thread, lock the mutex I am in the child, want to get the lock I can not run to here, oop...//하위 프로세스에 사라진 자물쇠가 없습니다

좋은 웹페이지 즐겨찾기