쓰레드 세이프(thread-safe)란 무엇인가요?

HiHi의 이미지

안녕하세요~!

가끔 함수들 사용할때 보면,
쓰레드 세이프하다, 쓰레드 세이프하지 않다
라는 말이 있는데, 이게 무슨 말이죠?
쓰레드 세이프하지 않은 함수를 쓰레드에서 쓰면 문제가 있다는
말같기도 하고..

조언 부탁드립니다.

tifler의 이미지

thread safe란 것은 여러 thread가 동시에 사용되어도
안전하단 말입니다.

보통 재진입 가능하게 만들어진 함수일 경우는 스레드 세이프이고,
전역 변수를 사용하지 않게끔 구성하게 되죠...

예를 들어

int a;

int inc(int n)
{
	a += n;
	return a;
}

라는 코드가 있다고 합시다.

만약 한개의 thread만이 동작하고 있다면 아무 문제 없이 동작하게 됩니다만!!

여러개가 사용한다고 했을때는 문제가 달라지게 되죠.

A라는 쓰레드가 1번라인을 수항하고 있는와중에 schedule되어서 B쓰레드가 다시 이 함수를 콜하게 되면...
엉뚱한 값을 리턴하게 됩니다.

해결방법으론 전역변수를 최대한 제거를 하고,
불가능 하다면 mutex를 사용하여야 겠지요...

pthread를 예로 들면

int a;
pthread_mutex_t a_lock = PTHREAD_MUTEX_INITIALIZER;

int inc(int n)
{
	pthread_mutex_lock(&a_lock);
	/* critical section */
	a += n;
	pthread_mutex_unlock(&a_lock);
}

이런식으로 하면 되겠죠...

standard library에 있는 몇몇 함수중에 thread safe하지 않은것이 있는데...
대표적인 예로 gmtime이 있죠...

gmtime은 내부적으로 static으로 선언된 변수의 포인터를 리턴하게 되는데,
위에서 지적한 전역변수를 사용하기 때문에 thread safe하지 못하게 됩니다.
gmtime대신 gmtime_r을 사용하면 해결 됩니다...

/***********************
* while(1) sleep(INFINITE);
***********************/

ssehoony의 이미지

쓰레드 안정성.

쓰레드에서 사용해도 안전하다. 라는 의미인데요.
멀티 프로세스나 멀티 쓰레드의 동기화에 대해 알고 계신다면,
클리티컬 섹션에 대한 동시 접근을 하지 않도록 하는 뮤텍스를 알고 계실텐데요.
멀티 쓰레드 환경에서 뮤텍스를 사용자가 생각하지 않고 그냥 사용해도 안전하다 라는 뜻입니다.

sodomau의 이미지

만약 어떤 함수가 기존의 global variable이나 그 함수 자체의 static variable등의 값을 참고해서 움직이게 되면 thread safe 하지 않은 결과가 나오겠죠.
그러니깐 그냥 원래의 의도는

한번 부를때마다 1씩 더해서 출력하고 싶어서

void counter() { static int c=0; printf("%d\n",c++); }

이렇게 해 줬는데
thread A랑 thread B에서 동시에 사용한다면 둘 다 원하는 결과를 얻지 못하거나 하는 그런 거죠.. 잘 생각해 보시면 strtok 같은 함수들이 별로 thread-safe하지 않은 구조라는 것을 느끼실 수 있습니다. (실제로 thread-safe하지 않은지는 잘 모르겠습니다만; )

ssehoony의 이미지

쓰레드 안정성.

쓰레드에서 사용해도 안전하다. 라는 의미인데요.
멀티 프로세스나 멀티 쓰레드의 동기화에 대해 알고 계신다면,
클리티컬 섹션에 대한 동시 접근을 하지 않도록 하는 뮤텍스를 알고 계실텐데요.
멀티 쓰레드 환경에서 뮤텍스를 사용자가 생각하지 않고 그냥 사용해도 안전하다 라는 뜻입니다.

ssehoony의 이미지

쓰레드 안정성.

쓰레드에서 사용해도 안전하다. 라는 의미인데요.
멀티 프로세스나 멀티 쓰레드의 동기화에 대해 알고 계신다면,
클리티컬 섹션에 대한 동시 접근을 하지 않도록 하는 뮤텍스를 알고 계실텐데요.
멀티 쓰레드 환경에서 뮤텍스를 사용자가 생각하지 않고 그냥 사용해도 안전하다 라는 뜻입니다.

ddoman의 이미지

http://bbs.kldp.org/viewtopic.php?t=19248&highlight=%C0%E7%C1%F8%C0%D4+thread-safe

reentrant와 thread-safe의 차이점에 대해 나와있습니다.

elmia의 이미지

strtok의 경우 Multi-thread환경에서는 사용하면 안되는데,
동기화를 하든 안하든 여러곳에서 호출하면 안되는 함수로 알고 있습니다.

이것도 thread-safe하지 않다고 말 할 수 있는걸까요 -_-a?

약간은 말장난같기도 하지만 궁금하군요.

Music is the greatest communication in the world.

mykldp의 이미지

http://www-106.ibm.com/developerworks/java/library/j-jtp09263.html

자바 쓰레드에 관한 이야기입니다. 제목이 Characterizing thread safety 입니다.

HiHi의 이미지

좋은 글들 감사드립니다.
역시 여긴 고수가 많군요.

간단하게 생각하자면, 한없이 간단하지만...
복잡하게 생각하자면, 한없이 복잡한 문제같네요.

아무튼 요지는 파악했으니, 감사합니다~

^^

markboy의 이미지

elmia wrote:
strtok의 경우 Multi-thread환경에서는 사용하면 안되는데,
동기화를 하든 안하든 여러곳에서 호출하면 안되는 함수로 알고 있습니다.

그래서 strtok_r 함수가 있지 않나요? :)

sodomau의 이미지

elmia wrote:
strtok의 경우 Multi-thread환경에서는 사용하면 안되는데,
동기화를 하든 안하든 여러곳에서 호출하면 안되는 함수로 알고 있습니다.

이것도 thread-safe하지 않다고 말 할 수 있는걸까요 -_-a?

약간은 말장난같기도 하지만 궁금하군요.

사실은 쓰다가 저도 좀 이상해서(제가 잘못 알고 있는 것 같아서) 안 올릴려고 했는데 이상하게 글이 올라가 있네요 ㅋ;;
아까 글 등록시키는 중에 등록 안 되고 멈춰있길래, 이상한거 같기도 해서 x 누르고 빠져나왔었는데 -_-; 등록 안된 것 처럼 보였는데 등록이 되어 있었군요;
헐헐;; 왠지 모를 민망함;; ㅋ

수정)
근데 위의 링크 찾아 보니 제 생각이 맞군요; ㅋ

댓글 달기

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