Critical Section으로 동기화를 할때..

kid1402의 이미지

현재 멀티 스레딩 환경에서 스레드를 여러개 쓰는 프로그램을 제작하고 있는데..

당연히 멀티 스레드가 접근하는 자원에 대해서는 CS로 동기화를 해주고 있습니다

그런데, 저 이전 사람의 작업을 보니, 멀티 스레딩 환경이긴 하지만 단 하나의 스레드만 접근하는, 즉 CS로 굳이 동기화를 해주지 않아도 순차적인 접근이 보장되는 자원에 대해서도 CS를 통해 동기화를 해주더라구요.

얼핏 생각하면 CS로 동기화를 하든 말든 잘 돌아갈거같은데..

혹시 멀티스레드 환경에서, 굳이 동기화를 할 필요가 없는 싱글 스레드 자원에 CS로 락/언락 작업을 할 때 일어날 수 있는 예외적인 상황에 대해 겪어보셨거나 아시는 분 계신가요?

하나라도 확실하게 하고 가고싶어서.. 질문남깁니다.!

박영만의 이미지

동기화 할 필요가 없다는 부분을 명확히 하여야 할 것 같습니다.
여러 thread 에서 해당 resource 를 접근할 수 있지만,
단지 현재 하나의 thread 에서만 접근하고 있는 것이라면 lock 을 걸어주는 것이 맞을테고 ( 차 후 발생될 수 있는 문제에 대비 )
진정 하나의 thread 에서만 접근 가능한 resource 라면 불필요한 code 입니다.( code performance 만 떨어뜨리게 됩니다.)

shint의 이미지

//
cs를 사용할때 문제는 몇가지 정도인데요. 틀린 내용도 있으니. 아시는분은 답변 좀 달아주세요.

1. 잘못사용해서 그런지. cs 한다고 제대로 락 걸리지 않아 보입니다. 확실한건. mutex 사용하면 됩니다. 대신 너무 느려요.
2. 여러개의 스레드는 각 스레드당 각각의 cs를 지정해주는것이 좋았던거 같습니다. 너무 많은 cs는 느려져서 좋지 않습니다.
3. cs가 중복적으로 enter되는 경우. 문제가 일어날 수 있습니다.

4. 되도록이면. 스레드에 안정적인 dll 함수를 사용하거나.
5. if(조건 == 0) return; 등으로 침입을 막는 방법도 해봤습니다. InterlockCounter()인가?도 제대로 사용되지는 않았습니다.
6. 이와 비슷하게. CSyncObject는 싱글톤'인가랑 비슷한 생각인데. ㅡ_ㅡ;;; cs보다 조금 더 안정적인거 같습니다. 소멸되면 해지하는 방식이라서요.?
7. 보니까. 이벤트 방식으로 멈추고 움직이는 방식도 있고. 스레드 자체를 멈추고 움직이는 방법도 있습니다.
8. 메모리를 변수별로 분리하고. 스레드를 각각의 함수로 만들어서 사용하게 되면. 충돌할 일이 없습니다.
9. 시분할'을 해서. 특정시간에만 처리할 수 있도록. 스레드의 동작 범위를 지정해주는것도 가능합니다.
10. read/ write를 구분하면. 더 안정적으로 만들 수 있다고 하네요.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

jick의 이미지

1. Critical section을 만들어주는 기능을 mutual exclusion이라고 부르는 건데요... 아니면 혹시 특정 OS의 함수 이름을 얘기하시는 건가요?

shint의 이미지

윈도우에서는 그런 함수가 있어요. ㅇ_ㅇ;;;

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

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