여러 스레드가 하나의 함수를 동시에 사용하려 들때, 과연 함수는 동시에 실행될 수 있나요 ?

dingkyu의 이미지

최근 멀티스레드로 프로그램을 작성하다가 문뜩 궁금한 사실이 생겨서 질문글 작성합니다.

간단히 제가 궁금해하는 사항을 설명하면 다음과 같습니다.

A 라는 콜백함수 형태의 함수가 있습니다.

그리고 2개 이상의 스레드가 실행하면서 A라는 콜백함수를 호출하게 됩니다.

시스템이 듀얼코어 이상이라, 2개의 쓰레드가 동시에 수행이 가능하다고 할때, 이 A라는 콜백함수 역시 동시에 수행이 가능한가요 ? 즉 동시에 2개 이상의 스레드에 의해 호출이 가능하고 그 기능역시 수행이 가능한건지 궁금합니다.

만약 안된다면, 2개의 스레드중, 하나의 스레드가 먼저 A 함수를 호출해서 함수내용을 수행하고 그 다음 스레드가 A함수를 호출해서 함수내용을 수행하게 되는것인지, 궁금하네요.

참고할 수 있도록 도움 부탁드리겠습니다.

neocoin의 이미지

작성중이라면 직접 해보세요. A함수 내에서 지역변수만 쓰는 이상 쓰레드마다 각기 다른 스텍으로 돌아갈텐데 아무 상관없습니다.

dingkyu의 이미지

그러면 하나의 함수가 어느 쓰레드에 의해서 사용중이다 라는것을 어떻게 확인할 수 있나요 ?
틀림없이 어떤 방법이 있을꺼 같은데 그 방법을 모르겠습니다. 어떤 키워드로 검색을 해야 하는지도 감이 잘 안오구요.

괜찮으시면 개략적인 설명이나 바쁘시다면 검색의 키워드 정도만이라도 가르켜주시면 감사하겠습니다.

고민이 많아 고민인 애늙은이 입니다.

bluebamus의 이미지

문제 없이 잘 돌아 갑니다.

물론 제가 했던 방식은

Session이라는 Struct에 callback 함수를 넣고

각 thread에 사용되는 Session에 각각의 Callback을 초기화/등록 시켜줬다는 전제 입니다.

bluebamus의 이미지

제 답이 틀린 방향으로 가는거 같군요....

듀얼코어에서 동시 수행이라는 전제에 대해서는.....

잘 모르겠네요 그래도 혹시 다른 분들에게 도움이 될지 모르니

리플 스택은 유지해 놓도록 하겠습니다.

kkb의 이미지

그렇게 수행 가능합니다
실제로 그렇게 동작되게 하기 위해 나온 개념이 스레드입니다

어떤 문제가 있을까요?
코드는 코드 영역에 있는 읽기전용이니 동시에 수행되어도 당연히 문제 없을 테고
함수 내에 있는 지역변수들에게 동시에 접근하는 동기화 문제를 있을 거 같지만
그 지역변수들은 서로 다른 메모리 영역에 저장되어 있습니다
이름만 같은 서로 다른 변수가 됩니다

단, 함수 내에서 전역변수나 static 변수는 같은 메모리 영역에 저장되어 있습니다
변경하는 경우 동기화 문제가 생깁니다
따라서 mutex 등으로 동기화 문제가 발생하지 않게 작성하셔야 합니다

dingkyu의 이미지

저도 제가 알고 있기로는 함수 자체는 하나의 명령어 셋이 되어 메모리의 일정 부분을 차지하고 있어서, 단순히 그냥 읽어 내려가면서 그 명령어 셋을 실행하면 되는것으로 이해를 하고 있었습니다만, 이게 그냥 막연히 알고 있었던 부분이라서요..

당연히 데이터로의 접근은 뮤텍스나 크리티컬섹션 등을 통해 동기화를 시켜야 한다고는 알고 있었습니다만, 함수 자체도 그렇게 실행되는것이 맞는가 라는게 아리송 해서요..

답변 감사드립니다.

고민이 많아 고민인 애늙은이 입니다.

klara의 이미지

reentrant와 thread-safe의 차이에 대해 알아보시는 것도 도움이 될듯합니다.

dingkyu의 이미지

알려주신 키워드에 대해 공부해 보도록 하겠습니다.
감사합니다.

고민이 많아 고민인 애늙은이 입니다.

댓글 달기

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