Message Queue, DLL(so), MySQL DB 사용시 Thread 동기화 사용 여부 문의

markman의 이미지

안녕하세요.

CentOS에서 프로그램을 만들고 있는데
main thread가 message queue로 수신받은 데이터를 버퍼에 집어넣으면
각 child thread들은 버퍼에 데이터를 꺼내와서 처리하는 구조입니다.
둘다 while문에 usleep(50000)을 지정하였습니다.

전역변수는 가급적 사용하지 않았고 사용하더라도 해당 child thread의 index로 구분을 하였습니다.

여러개의 child thread들은 공통적으로 Message queue send함수, DLL에서 명시적으로 호출한 함수 및
MySQL DB set/get함수를 사용합니다.

이런 경우 위의 함수를 사용하는 부분을 모두 pthread_mutex_lock() 및 pthread_mutex_unlock()
처리 해주는 것이 맞습니까?

mutex 사용을 많이 하면 성능저하가 발생할 것 같은데 위와 같은 경우에는 어떻해야할지 잘 모르겠습니다.

익명 사용자의 이미지

1) 쓰레드들 간에 공유하는 변수가 있는가?
2) 차일드 쓰레드들이(공통으로 사용한 코드) 사용한 메시지큐(또는 임의의 함수/라이브러리)가 쓰레드세이프(threadsafe)하지 않은가?
위 두가지를 검토하시고, 둘 중 하나라도 '예'가 나온다면 반드시 동기화(위의 뮤텍스 등과 같은 처리)가 필요합니다.

* 쓰레드세이프에 대해 모르신다면, 이에 대해서는 만사 제쳐 놓고 심도있게 봐야합니다.(쓰레드를 이용하고자 하는 경우)
* 커널(운영체제)가 제공하는 시스템호출은 쓰레드세이프합니다. 단, 사용자 영역에서 제공하는 래퍼(wrapper)나 라이브러리의 경우는 그렇지 않은 경우가 종종 있습니다.
* 말씀하신대로 뮤텍스등 동기화를 위한 시스템 호출의 남발은 성능저하의 원인이 되므로, 뮤텍스 때문에 성능이 우려된다면, 뮤텍스를 최대한 회피하는 프로그램 설계 및 구현이 필요합니다.
* usleep(), sleep()등을 이용해서 타이밍을 맞추려고 하는 시도는, 하드웨어 및 이의 제어부(임베디드 운영체제 등)가 고정된 경우 일지라도 절대 사용하지 말것을 권고합니다. 이상한 오동작("어제까지 잘~ 돌았는데....") , 자원 낭비 및 저성능을 초래할 수 있습니다.

markman의 이미지

1) 쓰레드들 간에 공유하는 변수는 전역 struct 변수가 있는데 각 쓰레드들이 자기 것만 사용하고 있습니다.
예를 들어, Thread#1은 array[1], Thread#2은 array[2] 이런식으로요. 일종의 TSD라고 보면 되겠습니다

2) MySQL 함수인 mysql_query(), mysql_store_result(), mysql_fetch_row()는 wrapper 함수라고 봐야겠군요.
Message Queue는 시스템 호출이므로 thread-safe하다고 봐야되나요?

3) 쓰래드들이 쓰는 함수는 로컬변수만을 사용하도록 (reentrant) 하였습니다.
다만 DLL 함수들을 보니 전역변수를 사용하고 있어서 이 함수들을 사용하는 부분은 mutex 처리하였습니다.

4) usleep()를 사용하지 않으면 loop문이 시스템 자원을 계속 잡고 있어서 느려집니다.
타이밍을 맞출려는 목적은 아니고 어느 한 thread(Main thread 포함)가 자원을 계속 잡아먹지 않게
할려고 사용하였습니다.
이런경우 만약 sleep()/usleep()를 사용하지 않는다면 어떤 방법으로 처리해야 하나요?

댓글 달기

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