我在多线程中遇到了一个问题,多线程模型是 1 Producer - N Consumer。
Producer 生成数据(每个字符数据大约 200 字节),将其放入固定大小的缓存中(即 2Mil)。数据与所有线程无关。它应用过滤器(已配置)并确定没有线程符合生成的数据。
生产者将指向数据的指针推送到合格线程的队列中(仅指向数据的指针以避免数据复制)。线程将 deque 并通过 TCP/IP 将其发送给它们的客户端。
问题:由于只有指向数据的指针提供给多个线程,当缓存变满时,Produces 想要删除第一项(旧项)。任何线程仍然引用数据的可能性。
可行的方式:使用原子粒度,当生产者确定符合条件的线程数时,它可以更新计数器和线程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; }
};
查切大师
map<seqnum, Data>
|
v
pair<CharData, InUseCounter>
当生产者删除它检查计数器的元素时,它大于 0,它会发送动作以释放对 m_in_use_threads 集中线程的引用。
问题
- 如果主缓存中有 2Mil 记录,则 InUseCounter 的数量将相等,因此 Mutex 变量,是否建议在单个进程中拥有 2Mil 互斥变量。
- 拥有大的单一数据结构来维护 InUseCounter 将导致更多的锁定时间来查找和减少
- 什么是我查找引用的最佳替代方法,以及谁拥有这些引用并且锁定时间非常短。
提前感谢您的建议。