[완료] 쓰레드 2개가 서로를 블럭시키면서 돌게 하려면..

nekoko의 이미지

쓰레드 2개가 각각 돌고 있고요,
한쪽이 데이터를 생성하면 다른 스레드가 그것을 처리하는 식입니다.
그런데 데이터가 다 처리되기 전에 데이터가 생성되면 안됩니다. (겹치니까요..'ㅅ')
데이터가 다 처리되면 그제서야 데이터가 생성되야 하구요.
데이터가 생성되면 그걸 처리하고..
이런 식인데 뮤텍스 가지고 해보려고 했는데 잘 안되네요
뮤텍스를 2개 써야 하나..싶은데 왠지 이상한 것 같고요
보통 이런 경우 깔끔하게 어떻게 처리하나요?

empty2fill의 이미지

뮤텍스 하나로 메시지 큐를 공유하도록 만들고, 큐 사이즈를 1로 하면 되지 않을 까요?

물론 해보진 않았습니다^^;

——
———
Life is a tragedy when seen in close-up, but a comedy in long-shot. - Chaplin, Charlie -

라스코니의 이미지

가장 깔끔한 방법은 하나의 쓰레드로 하는 겁니다.
while(1) {
데이터 생성
|
V
데이터 처리
}

두개의 thread로 구현하면 mutex가 아니라 binary semaphore를 2개 쓰면 됩니다.

binary_sem1 기다리기
데이터 생성
binary_sem2 주기

binary_sem2 기다리기
데이터 처리
binary_sem1 주기

shyblue의 이미지

일단 TBB를 쓸수 있는 환경이면 쉽게 처리할 수 있을거 같은데요?

결국, 쓰레드 A,B가 있다면, A는 생성하는놈, B는 처리하는 놈
쉽게 얘기하면, A는 쌓고, B는 빼고 인데, 여기서 Stack이든 Queue든 Thread safe 하면 되는것.

이게 맞다면, TBB를 사용해서 쉽게 처리할 수 있습니다.
concurrent_bounded_queue 를 사용해서 처리하면, lock-free 하게 Push,pop을 여러 Thread에서 할 수 있습니다.

넣을 놈 A

concurrent_bounded_queue<tData> m_DataQueue;
 
tData.setName("blahblah");
tData.setPrice(20000);
 
m_DataQueue.push(tData);

처리할 놈 B

do
{ TData tempData; m_DataQueue.pop(tempData); ProcessData(tempData);
}while(true);

concurrent_bounded_queue 는 pop할게 없을 경우 다음 Push가 있을 때까지 block되어 있습니다.
즉 뺄게 없으면 block 상태를 유지합니다.

時日也放聲大哭

nekoko의 이미지

C라서요,, 'ㅅ'
2개의 binary semaphore로 일단은 잘 동작하는 것으로 보입니다.
리플 감사합니다.

"I'm convinced that the only thing that kept me going was that I loved what I did." - Steve Jobs 1955-2011

댓글 달기

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