我遇到了多线程中的问题,多线程模型是1个生产者 - N个消费者。多线程中对数据的引用跟踪(多少/谁)
生产者所产生的数据(字符数据周围200bytes每个),把它在固定大小的高速缓存(即2密耳)。数据与所有线程无关。它应用过滤器(已配置)并确定线程数量是否符合生成的数据。
生产者推动指针数据分成合格的线程队列(仅指向数据的指针,以避免数据复制)。线程将deque并通过TCP/IP发送给它们的客户端。
问题:因为只有指针数据被提供给多个线程,当高速缓存变满,主要生产要删除的第一个项目(旧)。任何线程仍然可能引用数据。
可行之路:用原子粒度,当制片人决定了排位赛的线程数,它可以更新计数器和线程ID列表。
class InUseCounter
{
int m_count;
set<thread_t> m_in_use_threads;
Mutex m_mutex;
Condition m_cond;
public:
// This constructor used by Producer
InUseCounter(int count, set<thread_t> tlist)
{
m_count = count;
m_in_use_threads = tlist;
}
// This function is called by each threads
// When they are done with the data,
// Informing that I no longer use the reference to the data.
void decrement(thread_t tid)
{
Gaurd<Mutex> lock(m_mutex);
--m_count;
m_in_use_threads.erease(tid);
}
int get_count() const { return m_count; }
};
主chache
map<seqnum, Data>
|
v
pair<CharData, InUseCounter>
当生产者将删除它检查计数器的元件,为大于0时,它发送动作以释放设置m_in_use_threads参考到螺纹上。
问题
- 如果在主缓存2MIL记录,将有相等数量 的InUseCounter,所以互斥可变因素,在一个单一的过程中这个建议有2MIL互斥varible。
- 有大单数据结构来保持InUseCounter将 造成更多的锁定时间去寻找和减少
- 什么是对我的方法的最佳替代品,以找出引用和谁 都非常少引用锁定时间。
提前感谢您的建议。
啊,同样的想法:)简洁的参考! – 2012-01-10 08:43:45