pthread_cond_wait이 환경에따라 정상동작 아니면 데드락에 빠짐

ctcquatre의 이미지

리눅스에서 pthread를 이용하여 프로그래밍하고 있습니다.

프로그램을 다 코딩하고 로컬컴[우분투 5.04 kernel 2.6.10] 에서는 잘 돌아가는것을 확인했습니다.

다른컴에서도 테스트해볼려고

레드헷 7.1 [kernel 2.4.18 ] 이 설치되어있는 컴에 제 코드를 컴파일하고
실행시키니

로컬컴에서 잘 되더 스레드 pthread_cond_wait가 레뎃 7.1에서 아예 신호를 받지 못하더군요.

아래에 단편화 시킨 코드를 올립니다.

static pthread_mutex_t resourceInfoBroadcast_Mutex=PTHREAD_MUTEX_INITIALIZER;	/**< ManagerMain함수 와 ResourceInfoBroadcast스레드 간의 mutex */
static pthread_cond_t resourceInfoBroadcast_Cond=PTHREAD_COND_INITIALIZER;		/**<  ManagerMain함수 와 ResourceInfoBroadcast스레드간의 cond */
static pthread_t resourceInfoBroadcast_ThreadID=0;		


void *ResourceInfoBroadcast()
{
	unsigned int broadcastDataSize;
	int broadcastNowTime;
	int totalConnection;

	while(1)
	{
		printf(" in resourceInfoBroadcast()\n");
		if(pthread_mutex_lock(&resourceInfoBroadcast_Mutex) !=0 )
			ErrorHandle(ERROR_PRINT,"%s\n","thread lock failed");
		
		if(pthread_cond_wait(&resourceInfoBroadcast_Cond,&resourceInfoBroadcast_Mutex) != 0)
			ErrorHandle(ERROR_PRINT,"%s\n","thread  sigal Wait failed");

		printf(" resource thread receive cond signal ......please  ...\n");
e;
		
		if(pthread_mutex_unlock(&resourceInfoBroadcast_Mutex) != 0)
			ErrorHandle(ERROR_PRINT,"%s\n","thread unlock failed");

	}
	
	return NULL;
}


void ManagerMain()
{
	unsigned int managerNowTime=0;
	int totalConnection;
	
	//value of [resourceCollectIntval] must have 1 or 2
	unsigned short resourceCollectIntval=configData.resourceCollectIntval;	

	
	if(pthread_create(&resourceInfoBroadcast_ThreadID,NULL,ResourceInfoBroadcast,NULL) !=0)
		ErrorHandle(ERROR_PRINT_EXIT,"%s\n","create [ResourceInfoBroadcast]  failed!");
	

	
	while(1)
	{
		if(managerNowTime >= MAX_COLLECT_TIME)
			managerNowTime=1;
		else
			managerNowTime++;
		
		sleep(1);
		
		if(!(managerNowTime % resourceCollectIntval))
		{
			totalConnection=1;

			
			if(totalConnection > 0)
			{
				
				printf("Total connect : %d\n",totalConnection);
				if(pthread_mutex_lock(&resourceInfoBroadcast_Mutex) != 0)
					ErrorHandle(ERROR_PRINT,"%s\n","main lock failed");
		
				if(pthread_cond_signal(&resourceInfoBroadcast_Cond) != 0)
					ErrorHandle(ERROR_PRINT,"%s\n","main cond sigal failed");
				
				if(pthread_mutex_unlock(&resourceInfoBroadcast_Mutex) != 0)
					ErrorHandle(ERROR_PRINT,"%s\n","main unlock failed");
			}
		}
	}
}

여기저기 상관없는 부분은 나름대로 잘랐습니다.

동작은 ManagerMain 함수에서 resourceInfoBroadcast 스레드를 생성시키고

managerMain에서 resourceInfoBroadcast을 깨우는것입니다.

실행결과는

in resourceInfoBroadcast()
Total connect 1
Total connect 1
Total connect 1
Total connect 1
Total connect 1
Total connect 1
.
.
.

위와 같이 스레드가 깨어나질 않습니다.

resource thread receive cond signal ......please 이 출력문을 꼭보고싶은데

도대체 왜 이런 현상이 일어나는지.. 조언 부탁드립니다..

즐거운 한주의 시작 되세요

kicom95의 이미지

솔라리스에서는 문제가 없는 코드이군요...

(코드 가져다가 직접 고쳐서 돌려봤어요 )

해당 리눅스의 커널에 문제가 있다고 하면 -_-;; 그럴리는 없고....

고수님들의 고견을..

가자 해외로 ~ .. 돈 벌러.

mr.lee의 이미지

음.
얼핏 소스가 너무 복잡게 눈에 들어오길래

자세히 보니...

변수명이 엄청 기네요. :shock:

레뎃 7.1에서의 gcc 버젼이 어떻게 되나요? 2.95쯤 되었던것 같기도 한데...

ctcquatre의 이미지

어..저도 다른거 다 빼고 저소스만 따로 수정해서 레뎃 7.1에 돌리니까 .. 동작하네요..

참 이게 무슨 조화인지.
아직까지도 모르겠습니다.

어떤곳은 되고 어떤곳은 안되고..

다른곳을 찾아봐야 하는데 스레드 관련부분이 없어서 흠..
난감하네요 일단 좀 더 원인파악을 더 해봐야겠습니다.

Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.

ctcquatre의 이미지

이제서야 생각이나서 이문제에대해 답을 다는군요.

2.4에서는 제대로 동작않하고 2.6에서는 제대로 동작하는 이유는

제가 중간에 setuid함수로 프로세스 소유자를 바꿧기때문입니다.
물론 그 코드가 문제가 될지는 꿈에도 생각못하고 있었구요.

2.6에서 개발을 했기때문에 --;

커널 2.4에서는 프로세스 소유가 클론 개념으로 각각의 프로세스 ID를 가지기
때문에 소유권에 따로 영향을 받아버리는것을 확인했습니다.
그래서 pthread_cond_signal로 시그널을 보내줘도
pthread_cond_wait에서 전혀 시그널을 받지 못했습니다.

이 간단한거때문에 엉뚱한곳만 몇일 눈이 빠져라 본저로써는
나중에 버그를 고치면서 어처구니가 좀 없더군요 :)

Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.