linux에서 mutex Unlock시에 segmentation fault 가 발생되는 현
글쓴이: ldy1210 / 작성시간: 금, 2004/03/12 - 12:00오후
#include <stdio.h> #include <pthread.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/shm.h> int shm_id; pthread_mutex_t *mutex = (pthread_mutex_t *)-1; pthread_mutexattr_t attr; void * thr_aaa(void * parg) { int temp = (int)parg; pthread_mutex_t *thr_mutex = mutex; while (1) { printf("lock start 1 : [%d] [%d]\n", thr_mutex, temp); fflush(stdout); pthread_mutex_lock(thr_mutex); printf("lock start 2 : [%d] [%d]\n", thr_mutex, temp); fflush(stdout); sleep(1); printf("lock end 1 : [%d] [%d]\n", thr_mutex, temp); fflush(stdout); pthread_mutex_unlock(thr_mutex); printf("lock end 2 : [%d] [%d]\n", thr_mutex, temp); fflush(stdout); sleep(3); } return 0; } int main() { pthread_t thr_a[20]; int i; shm_id = shmget(0x9000, sizeof(pthread_mutex_t), IPC_CREAT|0666); if (shm_id == -1) { printf("sharem memory error \n"); exit(1); } mutex = (pthread_mutex_t *)shmat(shm_id, NULL, 0); pthread_mutexattr_init(&attr); pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); pthread_mutex_init(mutex, &attr); for (i = 0; i < 2; i++) { if (fork() == 0) { if (pthread_create(&thr_a[i], 0, thr_aaa, (void *)i) == 0) { printf("Thread Create : [%d] [%d]\n", i, thr_a[i]); pthread_join(thr_a[i], NULL); } else { printf("Thread Create Error : [%d]\n", i); } break; } } pause(); }
위와 같은 프로그램을 실핸시키면 실행 결과가
Thread Create : [0] [1026]
Thread Create : [1] [1026]
lock start 1 : [1073819648] [0]
lock start 2 : [1073819648] [0]
lock start 1 : [1073819648] [1]
lock end 1 : [1073819648] [0]
이렇게 되어 있고 아무동작을 안하네요
어디를 어떻게 고쳐야 할지 고수님들의 의견을 듣고 싶네요
Forums:
답이 아니라서 ^^;아래 루틴이 조금 납득이 안가서.....glo
답이 아니라서 ^^;
아래 루틴이 조금 납득이 안가서.....
global변수로 선언하시면 될것 같은데
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
여러개의 프로세스의 쓰레드가 mutex를 사용하기 때문에 전역으로는 사용
여러개의 프로세스의 쓰레드가 mutex를 사용하기 때문에 전역으로는 사용할수 없습니다.
위에 main함수를 보시면 Fork하게 되어 있거든요
=========================
소스 공유의 세상을 위하여
semapore를 사용하심이 어떤지요...
semapore를 사용하심이 어떤지요...
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
제가 생각하기로도...
제가 생각하기로도 세마포를 사용해야할 것 같습니다.
아무리 shared memory를 쓴다고는 하지만 그건 메모리 공간을 공유하는 것 뿐이고 같은 process 내에서 사용하여야 하는 mutex를 다른 process 간에도 사용하려는 것은 잘못된 것인 것 같습니다.
결국 그 mutex는 thread 간이 아니라 process간에 사용되는 것이지 않습니까...
제가 알고 싶은건 x86솔라리스에서는 전혀 이상없이 동작하는데 왜 유독
제가 알고 싶은건 x86솔라리스에서는 전혀 이상없이 동작하는데 왜 유독 리눅스에서만 오동작을 하는지 하는 것과 해결책이 있는지 하는 것이지요
=========================
소스 공유의 세상을 위하여
리눅스에서는.....
리눅스의 쓰레드는 _POSIX_THREAD_PROCESS_SHARED를 지원하지 않습니다. 즉, 프로세스간에 mutex를 공유할 수 없다는 거죠...
이번 2.6버전에는 NPTL이 들어가면서 저 기능이 됩니다.
(아, 정확히는 된다고 합니다..저는 아직 테스트해보진 못했네요....--;)
저 기능이 되는지는 unistd.h를 참조하시고, sysconf 를 통해 확인하시거나
_POSIX_THREAD_PROCESS_SHARED 가 정의되었는지 확인해보시면 됩니다.
희상님의 답변 감사하고요그런데 제 커널버젼은 어떻게 확인하고 다시
희상님의 답변 감사하고요
그런데 제 커널버젼은 어떻게 확인하고 다시 설치하나요
너무 초보적인 질문이라서 ^^;
=========================
소스 공유의 세상을 위하여
[quote]제가 알고 싶은건 x86솔라리스에서는 전혀 이상없이 동작하는
본질적인 의도가 있을 경우 질문시에 포함하는게 어떠신지요.
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
커널확인
커널확인방법
# uname -a
커널컴파일
http://wiki.kldp.org/wiki.php/%B8%AE%B4%AA%BD%BA%C4%BF%B3%CE
Since 2003.
지금은 맥유저...
---
http://jtjoo.com
댓글 달기