pthread사용할때...

lkjt의 이미지

생성시 void* 로 형변환을 해서 넘기는데요,

쓰레드 함수에서 다시 변환을 하면 보낸 값이 안나오는데.

보낸 값이 이상하게 실행할때 마다 다른데요..

이럴경우에는 어떤것들이 잘못된거죠?

지역 변수도 공유가 되나요..?

안되는걸로 아는데...


void *ThreadFunction(void *data)
{
	const int *n = reinterpret_cast<int *>(data);

	FILE *fp = fopen("Result.txt", "w");
	if(fp)
		fprintf(fp, "%d\n", *n);
	return NULL;
}

int main()
{
	pthread_t p_thread[20];
	int i;
	int n = 3;
	for(i=0;i<20;i++, n++) 
		pthread_create(&p_thread[i], NULL, ThreadFunction, reinterpret_cast<void *>(&n));
	for(i=0;i<20;i++)
		pthread_join(p_thread[i], NULL);
}



죄송합니다.
n++가 빠졋엇네요 . :oops:

File attachments: 
첨부파일 크기
Image icon er.JPG39.52 KB
bugiii의 이미지

뭘 보내고 어떻게 받는지, 어떻게 보내는지 등을 코드로 표현하셔야죠...

liongo의 이미지

pthread관련 질문을 마니 하시는군요..

참고하시라고 적습니다..

http://www.joinc.co.kr/modules.php?name=News&file=article&sid=118

' 형식이 내용을 규정한다. '

lkjt의 이미지

질문올리기전에 pthread_api보고 따라햇는데...

안되서 이렇게 질문 드립니다...

liongo의 이미지

int n; 

n변수가 초기화 되지 않았습니다..

초기화 되지않은 변수에는 무슨 값이 들어갈지 알수없습니다.

' 형식이 내용을 규정한다. '

bugiii의 이미지

앗 먼저 답변을 다셨네요...

참고로 지역변수를 공유할 수 있습니다. 단 조건은 쓰레드가 사용하는 동안에도 그 지역변수가 살아있어야 합니다...

liongo의 이미지

앗 설명이 부족해서 한줄 추가햇느데 그새 또 글이 :)

다들 빠르시다..

' 형식이 내용을 규정한다. '

bugiii의 이미지

앗 그새 또 새글이...

다들 빠르시다.. -_-; 흉내 내봤습니다. (이렇게라도 빨리 승급을... ㅎㅎㅎ)

lkjt의 이미지

제 소스에서 도 지역변수가 공유 되나요?

아니라면 어떻게 해야 공유가 되죠?

n값을 초기화 시켜죠도 마찬가지네요...

bugiii의 이미지

pthread_create 함수의 첫번째 인자가 좀 의심스럽지 않습니까?

bugiii의 이미지

아직 결과가 나오지 않았습니까? 성공인지 실패인지 글을 남겨주시는 것도 좋습니다...

& 가 빠진 듯...

p.s. 빨리 빨리 승급을!!!

lkjt의 이미지

여전히 똑같네요 ㅠ,,,ㅠ

혹시 M$윈도우에서 pthread돌리는거라 불안정해서 그러는건가요..?

liongo의 이미지

#include <pthread.h>
#include <stdio.h>

void *ThreadFunction(void *data)
{
   const int *n = reinterpret_cast<int *>(data);

   FILE *fp = fopen("Result.txt", "w");
   if(fp)
      fprintf(fp, "%d\n", *n);
   return NULL;
}

int main()
{
   pthread_t p_thread[20];
   int i;
   int n = 8585;
   for(i=0;i<20;i++)
      pthread_create(&p_thread[i], NULL, ThreadFunction, reinterpret_cast<void *>(&n));
   for(i=0;i<20;i++)
      pthread_join(p_thread[i], NULL);
}

[liongo@green.xxx:/liongo] g++ -Wall test.c -lpthread
[liongo@green.xxx:/liongo] ./a.out
[liongo@green.xxx:/liongo] cat Result.txt
8585

이상없는데용 ㅡㅡ? 모가 문제일까..

' 형식이 내용을 규정한다. '

bugiii의 이미지

소스에 n 의 초기값을 아직 수정하지 않으셨네요? 수정했다고 치고...

Result.txt 파일에 뭐가 담기던가요? 한 라인만 담길 듯...

p.s. 또 뒷북입니다... -_-;

lkjt의 이미지

결과값은...

실행할때마다 결과값이 달라집니다... ( 변수 초기화는 일정 1로 함 )

이상합니다..

bugiii의 이미지

fopen, fprintf 말고 그냥 printf 해보세요. 어떻게 되나요?

p.s. msn 대화창이 되가는 게시판...

lkjt의 이미지

마찬가지네요

ㅠ,ㅠ

bugiii의 이미지

20번 찍히는 printf 로 해도 마찬가지라구요?

liongo의 이미지

void *ThreadFunction(void *data) 
{ 
   const int *n = reinterpret_cast<int *>(data); 

   FILE *fp = fopen("Result.txt", "w"); 
   if(fp) 
      fprintf(fp, "%d\n", *n); 
   fclose(fp); <--- 닫아주십시용.. 
   return NULL; 
} 

ㅡㅡa 왜 안되시징..

' 형식이 내용을 규정한다. '

lkjt의 이미지

,,,,

쓰레드 20개 생성합니다.

댓글 첨부 파일: 
첨부파일 크기
Image icon 0바이트
lkjt의 이미지

약간 이상하지만..

pthread_create()함수 호출하고

Sleep(300)

을 주니 잘되는군요..--;;;

lkjt의 이미지

제생각에는,,,

루프가 워낙 빠르다보니...

이러는거 같군요.

증가를 시켜버리면, 이상하게 넘기는게 증가되서 넘어가더군요 .ㅎ,,,

프로그래밍 경험중 이런경험은,,처음 ,,,

혹시 이런증상 나타나시면, 이렇게 해보세요.

lkjt의 이미지

아하,,,

그런게 아니군요...

이게 포인터 아닙니까?...

--;;;

당연히 원 변수가 바뀌니,,,흐흐,,,

이런실수를 ㅋ...

bugiii의 이미지

원래 변수가 어디서 바뀐다는거죠? 올린 코드랑 테스트 코드랑 틀리다는 건가요?

lkjt의 이미지

const int *n = reinterpret_cast<int *>(data);

포인터 아닌가요?

bugiii의 이미지

그게 무슨 상관인가요? 포인터를 보냈고 포인터로 받은 건데요? 출력할 때는 포인터가 가리키는 곳의 값을 읽은 것 아닙니까?

liongo의 이미지

왠지 동문서답한 기분이 ㅡㅡa

멀뚱 멀뚱...

Quote:

이 게시판을 사용하고 있는 사용자: bugiii, liongo, lkjt

ㅡㅡ;;;

' 형식이 내용을 규정한다. '

bugiii의 이미지

pthread_create 할 때 &n 이 아니라 (&n)++ 이런식으로 했다는 말씀이네요...

lkjt의 이미지

결론

포인터로 넘겨서 포인터로 받으려고 햇지만
루프가 돌면서 증가를 시켜 버리기 때문에포인터가 가르키는곳도 바뀌면서 같은 값이 출력되는것이엿습니다.

(이런 실수를,,,다음부턴 안해야죠 .ㅠ.)[/b]

liongo의 이미지

결론..

질문 올려주실때 좀 잘 체크해주시길... ㅡㅡa

전 아래만 보다가 원문이 바뀐걸 나중에 봤습니다.

원래 소스코드와 다른 코드가 올라와서 답글올리고..

답보구 원래소스를 고치고 결과가 다르고..

왠지 정신이 없군요 ㅡㅡa

' 형식이 내용을 규정한다. '

bugiii의 이미지

liongo wrote:
결론..

질문 올려주실때 좀 잘 체크해주시길... ㅡㅡa

전 아래만 보다가 원문이 바뀐걸 나중에 봤습니다.

원래 소스코드와 다른 코드가 올라와서 답글올리고..

답보구 원래소스를 고치고 결과가 다르고..

왠지 정신이 없군요 ㅡㅡa

그래서 msn 으로 대화중입니다. -_-;

댓글 달기

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