linux에서 mutex Unlock시에 segmentation fault 가 발생되는 현

ldy1210의 이미지

#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]

이렇게 되어 있고 아무동작을 안하네요
어디를 어떻게 고쳐야 할지 고수님들의 의견을 듣고 싶네요

alsong의 이미지

답이 아니라서 ^^;
아래 루틴이 조금 납득이 안가서.....
global변수로 선언하시면 될것 같은데

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

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

ldy1210의 이미지

여러개의 프로세스의 쓰레드가 mutex를 사용하기 때문에 전역으로는 사용할수 없습니다.

위에 main함수를 보시면 Fork하게 되어 있거든요

=========================
소스 공유의 세상을 위하여

alsong의 이미지

semapore를 사용하심이 어떤지요...

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

valor의 이미지

제가 생각하기로도 세마포를 사용해야할 것 같습니다.

아무리 shared memory를 쓴다고는 하지만 그건 메모리 공간을 공유하는 것 뿐이고 같은 process 내에서 사용하여야 하는 mutex를 다른 process 간에도 사용하려는 것은 잘못된 것인 것 같습니다.

결국 그 mutex는 thread 간이 아니라 process간에 사용되는 것이지 않습니까...

ldy1210의 이미지

제가 알고 싶은건 x86솔라리스에서는 전혀 이상없이 동작하는데 왜 유독 리눅스에서만 오동작을 하는지 하는 것과 해결책이 있는지 하는 것이지요

=========================
소스 공유의 세상을 위하여

김희상의 이미지

리눅스의 쓰레드는 _POSIX_THREAD_PROCESS_SHARED를 지원하지 않습니다. 즉, 프로세스간에 mutex를 공유할 수 없다는 거죠...

이번 2.6버전에는 NPTL이 들어가면서 저 기능이 됩니다.
(아, 정확히는 된다고 합니다..저는 아직 테스트해보진 못했네요....--;)

저 기능이 되는지는 unistd.h를 참조하시고, sysconf 를 통해 확인하시거나
_POSIX_THREAD_PROCESS_SHARED 가 정의되었는지 확인해보시면 됩니다.

ldy1210의 이미지

희상님의 답변 감사하고요

그런데 제 커널버젼은 어떻게 확인하고 다시 설치하나요

너무 초보적인 질문이라서 ^^;

=========================
소스 공유의 세상을 위하여

alsong의 이미지

Quote:
제가 알고 싶은건 x86솔라리스에서는 전혀 이상없이 동작하는데 왜 유독 리눅스에서만 오동작을 하는지 하는 것과 해결책이 있는지 하는 것이지요

본질적인 의도가 있을 경우 질문시에 포함하는게 어떠신지요.

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

shyxu의 이미지

ldy1210 wrote:
희상님의 답변 감사하고요

그런데 제 커널버젼은 어떻게 확인하고 다시 설치하나요

너무 초보적인 질문이라서 ^^;

커널확인방법

# uname -a

커널컴파일

http://wiki.kldp.org/wiki.php/%B8%AE%B4%AA%BD%BA%C4%BF%B3%CE

Since 2003.
지금은 맥유저...
---
http://jtjoo.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.