스레드 관련 질문이에요...

moonlight의 이미지

중복일지도 모르지만, 여러 고수님들의 조언 부탁드립니다.

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<pthread.h>
#include<unistd.h>

void* printnum(void *arg);

#define	MAXTHREAD	5

main()
{
	pthread_t tid[MAXTHREAD];
	int	  *t;
	int	  i;

	for(i=0; i<MAXTHREAD; i++)
	{
		if(pthread_create(&tid[i],NULL,printnum,(void*)i) != 0)
		{
			printf("Error %d\n",i);
			exit(1);
		}
	}
	
	for(i=0; i<MAXTHREAD; i++)
	{
		if(pthread_join(tid[i],NULL) != 0)
		{
			printf("Errir join %d\n",i);
		}
		else
		{
			printf("%d thread is done\n",i);
		}
	}
	return 0;
}

void* printnum(void *arg)
{
	int j;
	for(j=0; j<1000; j++)
	{
		printf("%d : %d\n",(int*)arg,j);
	}
}

이렇게 했는데, 제가 생각한 결과는 5개의 스레드가 경쟁적으로

숫자를 출력할줄 알았는데,

결과는 하나의 스레드가 숫제를 다찍고, 다음 스레드...다음 스레드

이런식의 결과가 나오는군요...

그게 맞는지, 아니면, 제가 잘못한건지, 조언 한마디 부탁드립니다

체스맨의 이미지

OS 의 스케쥴링 정책에 따라 실행됐을 겁니다.

아마도 사용 중이신 컴퓨터가 단일 프로세서에 프로세싱 속도가 빨라서
지금과 같은 현상이 나타났을 가능성이 많구요.

루프 안의 숫자를 훨씬 더 크게 해보세요.
그래도, 매우 경쟁적으로 서로 번갈아가며 실행되진 않을 겁니다.

Orion Project : http://orionids.org

김성진의 이미지

쓰레드를 UNBOUND로 수행시키셨기 때문에(process scope)

그러한 현상이 발생할 수 있습니다.

이 경우 CPU를 양보하지 않으면 일반적으로 나머지 UNBOUND쓰레드는

동작할 수 없지만, 명시적으로 CPU를 양보하거나, mutex관련

thread wait으로 빠지는 경우 CPU를 양보합니다.

위의 경우도 아닌 경우는 UNBOUND 쓰레드가 I/O를 기다릴 경우인데

이때는 시스템에 따라 CPU를 양보할 수도 아닐 수도 있다고 합니다.

한편, 선과 같은 시스템에서는 concurrency level을 암묵적으로

쓰레드 라이브러리에서 동적으로 조절합니다.

그래서, 님의 프로그램을 수행시키면 시간이 조금 지나면,

모든 쓰레드가 동시에 동작하는 것을 확인하실 수 있습니다.

리눅스의 경우는 system scope, process scope 자체가 없기 때문에

default로 system scope로 동작합니다.

따라서, 첫번째 답변하신 분과 같이 루프 숫자를 크게 하면

서로 번갈아가면서 동작하는 것을 확인하실 수 있을 겁니다.

김성진 드림

고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.

freebird의 이미지

아래와 같은 쓰레드 스케줄링 방식을 변경할 수 있는 함수가 있습니다.
pthread.h에 여러가지 define이 있으므로 바꿔가면서 테스트 해 보시기 바랍니다.

pthread_attr_t thrd_attr;
.
.
pthread_attr_setschedpolicy(&thrd_attr, SCHED_RR);
.
.
pthread_create(&tid, &thrd_attr, func, args);

댓글 달기

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