[완료] 왜 쓰레드를 동기화 하지 않으면 느려질까요?

duraduri의 이미지

안녕하세요 질문이 있어 이렇게 연락드립니다.

두개의 쓰레드를 돌리는 프로그램을 작성하고 있습니다.

현재 쓰레드의 동기화를 시켜주지 않은 상태로 구동을 하니 시간이 지날수록

프로그램이 엄청나게 느려지게 되는것을 느낍니다(애니메이션이 느리게 진행됩니다.)

쓰레드의 동기화를 읽어봐도 자원에 대한 접근을 제어해줄뿐

왜 이렇게 속도가 느려질까 정확히 답이 떠오르지 않네요.

주스레드는 부스레드에서 여러가지 작업후 그 결과가 좌표로 주어지면
이를 이용하는 프로그램으로 애니메이션 작업을 타이머로 진행하였습니다.

부스레드는 영상을 분석하여 마우스 좌표를 검출해내는 일을 합니다.

부스레드에서 마우스 좌표가 검출되면 주스레드로 윈도우 메세지를

통해 직접 마우스 좌표를 전달하였습니다.

혹시 부스레드가 계속 CPU를 점유하고 새로그리는 부분이 실행이 안되서

끊기는 거처럼 느려지는걸까요?

쓰레드 동기화를 해주지 않게 되면 교착상태가 발생되어 프로그램이 느려지는걸까요?

오라일리에서 나온 win32 쓰레드관련 책을 잡고 오늘도 이렇게 흘러가네요..

오늘은 날씨가 풀린듯하지만 아직은 춥네요 감기 조심하세요

김성진의 이미지

쓰레드 동기화라는게 무슨 의미인지?

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

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

jick의 이미지

쓰신 것만 봐서는 전혀 엉뚱하고 예상치못한 곳에서 시간을 잡아먹고 있을 거라고 조심스럽게 예상해 봅니다. (음 이건 모순어법인가...)

이런 식의 문제는 직접 코드를 파보지 않는 한 설명만 들어서는 답이 안 나올 것 같습니다. 가끔씩 통하는 방법을 조언해 드리자면, 디버거에서 일단 프로그램을 돌리기 시작한 다음 느려졌다 싶을 때 수행을 중단시킵니다. 그 상황에서 스택을 떠보면 시간을 많이 잡아먹는 곳에서 멈춰있을 확률이 높기 때문에 문제가 발생한 곳을 찍을 수 있습니다.

(여러번 해서 계속 같은 곳에서 멈춘다면 확실하겠죠.)

coremaker의 이미지

저도 조심스럽게 예상해건데...

A와 B 두개의 쓰레드가 있을 때..
A와 B는 같은 자원을 공유하게 되었다..
해서 A와 B를 동기화 하지 않으니.. 수행 속도가 느리고..
A와 B를 동기화 했더니 상대적으로 수행속도가 빨라졌다...

이런 문제입니까?

김일영의 이미지

동기화한다는 말은 경합이 있을때 하는 말로 알고 있습니다.
동기화를 안해도 문제가 없다(? -> 문제가 실행 중에 잠시 숨은게 아니라면) 그럼 애당초에 경합이 없는거겠죠.
그럴 때 한쪽 쓰레드가 몹시 느려질 수 있다? 없다? 예, 있습니다.
그럴땐 필요 이상으로 많은 시간을 점유하는 쓰레드를 잠시 기절시켜 줘야 합니다.
sleep()이라든지...
busy-waiting 하는 함수는 기절이 아니니 그닥 좋은 결과가 나오지 않고요.
쓰레드가 자기 time slice를 양보하는 함수들이 있습니다.
걍 sleep()하삼.

bushi의 이미지

처음 댓글다신 분처럼 "쓰레드 동기화"라는 표현이 이해가 안됩니다.

예를 들어 동영상 재생프로그램을 만들면서 video 쓰레드, audio 쓰레드로 나누었다 칩시다.
둘 사이는 기본적으로 공유하는 자원이 없습니다. 각각 따로 지가 맡은 일만 열심히 하면 되니까요.
문제는 출력되는 audio 와 video 의 동기(sync)가 맞아야 한다는 겁니다.
깊이 생각한 끝에 audio 를 기준으로 삼아 video frame drop 을 하기로 했다 칩시다.
이제 출력물이 그럴싸해집니다.

만약, video frame drop 을 하지 않았다면,
audio 에 비해 상대적으로 video 가 느리게 재생되는 것으로 보였겠지요.
시간이 지나면 지날 수록 video 와 audio 의 격차가 커지므로 감상하는 사람이 오해를 할 수도 있습니다.
"이넘의 프로그램, 처음엔 괜찮더니 시간이 지날수록 video 쓰레드가 점점 느려지네"

위에 예로 든 a/v sync 같은 문제를 "쓰레드 동기화"라고 표현하시는 건가요 ?
만약 그렇다면 답은 뻔합니다.
한쪽을 기준으로 삼아서 다른 한쪽의 불필요한 삽질을 없애는 겁니다.
삽질을 없애는 것이 허락되지 않는다면 코드를 고쳐서 더 빨리 돌게 하거나, 더 좋은 CPU 로 바꾸는 수 밖에 없습니다.

duraduri의 이미지

bushi님 말씀대로 서로 다른 일을 하는 두개의 쓰레드가 있지만

한쪽이 시간이 지나면 마치 아예 CPU의 자원의 할당을 못받는 느낌이었습니다.

그래서 해결책에 대해 고민하다 뮤텍스나 세마포어같은 쓰레드 동기화를 통해

속도문제를 해결할수있다는 글을 보았고, 관련 된 책자를 보았지만

자원에 대한 접근을 관리 한다는 동기화가 어떻게 쓰레드에 영향을 미치는지에

대해서는 알수가 없었습니다.

coremaker님 말씀대로 이미 진행된 프로젝트를 개인적으로 만들어 보고 싶어

만들던중, 진행된 프로젝트의 소스를 보니 뮤텍스를 통해 동기화를 해줬고 그 프로그램은

끊기지 않았습니다. 그래서 동기화 문제라고 생각하였습니다.

댓글 달기

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