fork 스레드 및 잠금

채팅방에 주기;
그룹에서 포크를 여러 라인에서 호출했지만 하위 프로세스가 실행될 수 없었습니다. 하위 프로세스에서도 같은 자물쇠에 접근했기 때문입니다.
fork의 하위 프로세스는 부모 프로세스 자물쇠의 상태를 계승합니다. 만약 fork가 잠겼을 때 이 자물쇠가 잠겼다면.
시뮬레이션의 예:
#include "util.h"
#include 
#include 
#include 
#include 
#include 
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void * func1(void *arg)
{
    printf("thread start : %ld
" , pthread_self()); pthread_mutex_lock(&mutex); puts("thread enter lock"); sleep(5); // 5 pthread_mutex_unlock(&mutex); } int main(int argc, char**argv) { pthread_t t1; pthread_create(&t1,0,func1,NULL); sleep(1); int pid = fork(); if(0 == pid){ // // , //pthread_mutex_unlock(&mutex); puts("child begin"); // mutex , , pthread_mutex_lock(&mutex); puts("??????????"); pthread_mutex_unlock(&mutex); return 0; } //parent pthread_join(t1,0); puts("begin wait child"); wait(NULL); return 0; }

 
코드에서 주석한 것은 해결 방법 중의 하나이다
 
다른 하나는 pthreadatfork:
#include "util.h"
#include 
#include 
#include 
#include 
#include 
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void * func1(void *arg)
{
    printf("thread start : %ld
" , pthread_self()); pthread_mutex_lock(&mutex); puts("thread enter lock"); sleep(5); pthread_mutex_unlock(&mutex); } void prepare(){ puts("preapre"); pthread_mutex_lock(&mutex); } void parent_handler(){ puts("parent handler"); pthread_mutex_unlock(&mutex); } void child_handler(){ puts(" ---------- child handler"); pthread_mutex_unlock(&mutex); } int main(int argc, char**argv) { pthread_t t1; pthread_create(&t1,0,func1,NULL); pthread_atfork(0,0,child_handler); // sleep(1); int pid = fork(); if(0 == pid){ puts("child begin"); pthread_mutex_lock(&mutex); puts("??????????"); pthread_mutex_unlock(&mutex); return 0; } //parent pthread_join(t1,0); puts("begin wait child"); wait(NULL); return 0; }

 
 
위 코드에서는child 만 사용했습니다handler, 하위 프로세스가 시작되자마자 호출되었습니다.
다른 2개 파라미터;

    // prepare  fork        
    // parent_handler fork         

    pthread_atfork(prepare,parent_handler,child_handler);

좋은 웹페이지 즐겨찾기