Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[2322] pthread 와 c++ 문제
일자무식 [] 1733 읽음    2003-04-08 20:29
간단한 큐를 만들어 테스트하던 중입니다.

이상하게 inserter 쓰레드에서 큐의 put 을 호출할때 세그폴트가 나면서 죽는 경우가

있습니다.

도무지 원인을 모르겠습니다. STL 과 thread 간의 문제인가요?....


또한, 로컬스코프내에 선언된 변수, 즉 스택에 위치하는 변수를 따로

동기화를 해주어햐 할 필요가 있는 경우도 있나요?

스택을 공유하는 경우도 있다고 들은것 같은데... 고수님들의 조언을 부탁

드립니다.

감사합니다.

------------------------------------------------------------


#include <iostream>
#include <strstream>
#include <string>
#include <deque>

#include <pthread.h>
#include <thread.h>
#include <unistd.h>

using namespace std;


pthread_mutex_t qmutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t qcond = PTHREAD_COND_INITIALIZER;


class QItem {
public:
   QItem(string s):data_(s) {}
   string data_;
};


class Queue {
public:
   Queue() {}

   void put(QItem item);
   QItem get();

private:
   deque<QItem> elems_;
};


void
Queue::put(QItem item)
{
   pthread_mutex_lock(&qmutex);

   elems_.push_back(item);
   pthread_cond_signal(&qcond);

   pthread_mutex_unlock(&qmutex);
}


QItem
Queue::get()
{
   pthread_mutex_lock(&qmutex);

   while (elems_.empty()) {
      pthread_cond_wait(&qcond, &qmutex);
   }

   QItem ret = *(elems_.begin());
   elems_.pop_front();

   pthread_mutex_unlock(&qmutex);

   return ret;
}

//////////////

Queue queue;

void*
inserter(void* arg)
{
   int i=0;

   while (true) {
      ostrstream os;
      os << i++;
      queue.put(QItem(os.str()));  // 여기서 죽는것으로 보임
   }
}


int
main()
{
   pthread_t thread;
   void *ttt;

   thr_setconcurrency(2);

   pthread_create(&thread, 0, inserter, 0);

   while (true) {
      QItem item = queue.get();
      cout << item.data_ << endl;
   }
}

+ -

관련 글 리스트
2322 pthread 와 c++ 문제 일자무식 1733 2003/04/08
2324     답변은 아니고 코멘트입니다. 김백일.cedar 1354 2003/04/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.