2015-01-27 3 views
1

mutil 다중 프로세스 프로그램에서 pthread_mutex_t를 사용하려고하는데 동기화를 위해 공유 메모리에 뮤텍스를 잠글 필요가 있습니다. 여기에 복사 코드는 from입니다.공유 메모리의 뮤텍스 잠금

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/mman.h> 
#include <pthread.h> 
pthread_mutex_t* g_mutex; 
void init_mutex(void) 
{ 
    int ret; 
    g_mutex=(pthread_mutex_t*)mmap(NULL, sizeof(pthread_mutex_t), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); 
    if(MAP_FAILED==g_mutex) 
    { 
     perror("mmap"); 
     exit(1); 
    } 


    pthread_mutexattr_t attr; 
    pthread_mutexattr_init(&attr); 

    //set mutex process shared 
    ret=pthread_mutexattr_setpshared(&attr,PTHREAD_PROCESS_SHARED); 
    if(ret!=0) 
    { 
     perror("init_mutex pthread_mutexattr_setpshared"); 
     exit(1); 
    } 
    pthread_mutex_init(g_mutex, &attr); 
} 
int main(int argc, char *argv[]) 
{ 
    init_mutex(); 
    int ret;  
    char str1[]="this is child process/r/n"; 
    char str2[]="this is father process/r/n"; 
    int fd=open("tmp", O_RDWR|O_CREAT|O_TRUNC, 0666); 
    if(-1==fd) 
    { 
     perror("open"); 
     exit(1); 
    } 
    pid_t pid; 
    pid=fork(); 
    if(pid<0) 
    { 
     perror("fork"); 
     exit(1); 
    } 
    else if(0==pid) 
    { 
     ret=pthread_mutex_lock(g_mutex); 
     if(ret!=0) 
     { 
      perror("child pthread_mutex_lock"); 
     } 
     sleep(10); 
     write(fd, str1, sizeof(str1)); 
     ret=pthread_mutex_unlock(g_mutex);  
     if(ret!=0) 
     { 
      perror("child pthread_mutex_unlock"); 
     }  
    } 
    else 
    { 
     sleep(2); 
     ret=pthread_mutex_lock(g_mutex); 
     if(ret!=0) 
     { 
      perror("father pthread_mutex_lock"); 
     } 
     write(fd, str2, sizeof(str2)); 
     ret=pthread_mutex_unlock(g_mutex);  
     if(ret!=0) 
     { 
      perror("father pthread_mutex_unlock"); 
     }     
    } 
    wait(NULL); 
    munmap(g_mutex, sizeof(pthread_mutex_t)); 
} 

quetion 내가 pthread_mutex_lock를 호출 한 후 msync 전화를해야 할 것입니다?

답변

0

아니요, msync()으로 전화하지 않아도됩니다. 이 함수는 매핑 된 메모리를 디스크로 플러시하지만, 아마도 같은 머신의 다른 프로그램이 같은 뮤텍스 상태를 보게된다면 신경 쓰지 않아도됩니다. 그리고 그들 중 누구도 추락하지 않는 한 그들은 그렇게 할 것입니다. 어쨌든 프로그램이 충돌하면 뮤텍스를 재설정하겠다고 생각합니다.

매핑 된 메모리를 디스크로 플러시하는 것은 실행중인 프로그램이 변경 사항을 기록한 동일한 프로그램이 해당 메모리를 읽을 수 있는지 여부와 관계없이 해당 메모리의 변경 사항을 볼 것인지 여부와 아무런 관련이 없습니다.

+0

감사합니다. –

관련 문제