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);