|
간단한 큐를 만들어 테스트하던 중입니다.
이상하게 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;
}
}
|