Solang said:
I have 3 threads A,B and C;
Thread A handle all GUI while thread B keep generating data(about 10K at a
time) and
supposedly pass that data to thread A. Everytime thread A get that data,
it also passes them to
thread C.
How fo I pass those data between threads?
A simple method is to create a queue; example pseudo-code typed in news
reader, please forgive any typos:
_______________________________________________________________________
struct node
{
node* m_next;
};
class queue
{
node* m_head;
node* m_tail;
public:
queue()
: m_head(NULL)
{
}
public:
void push(node* n)
{
n->m_next = NULL;
if (! m_head)
{
m_head = n;
}
else
{
m_tail->m_next = n;
}
m_tail = n;
}
node* pop()
{
node* n = m_head;
if (n)
{
m_head = n->m_next;
}
return n;
}
};
class thread_safe_queue
{
mutex m_mutex;
cond m_cond;
queue m_queue;
public:
void push(node* n)
{
{
mutex::guard lock(m_mutex);
m_queue.push(n);
}
m_cond.signal();
}
node* pop()
{
node* n;
{
mutex::guard lock(m_mutex);
while (! (n = m_queue.pop()))
{
m_cond.wait(lock);
}
}
return n;
}
};
_______________________________________________________________________
Or, if you prefer semaphores:
_______________________________________________________________________
class thread_safe_queue
{
mutex m_mutex;
semaphore m_sem;
queue m_queue;
public:
void push(node* n)
{
{
mutex::guard lock(m_mutex);
m_queue.push(n);
}
m_sem.post();
}
node* pop()
{
m_sem.wait();
mutex::guard lock(m_mutex);
return m_queue.pop();
}
};
_______________________________________________________________________