作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在多线程中遇到了一个问题,多线程的模型是 1 个生产者 - N 个消费者。
Producer 产生数据(每个字符数据大约 200 字节),将其放入固定大小的缓存中(即 2Mil)。数据并不与所有线程相关。它应用过滤器(已配置)并确定没有线程符合生成的数据。
生产者将指向数据的指针插入符合条件的线程队列中(仅指向数据的指针以避免数据复制)。线程将 deque 并通过 TCP/IP 将其发送给它们的客户端。
问题:因为只有指向数据的指针被提供给多个线程,当缓存变满时,Produces 想要删除第一个项目(旧的)。任何线程仍然引用数据的可能性。
可行方式:使用原子粒度,当producer确定符合条件的线程数时,它可以更新计数器和线程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>
当生产者移除它检查计数器的元素时,它会发送操作以释放对 m_in_use_threads 集中线程的引用。
问题
预先感谢您的建议。
最佳答案
InUseCounter
放在一个结构中最终会导致线程之间在释放记录时争用;如果线程不同步执行,这可能可以忽略不计。如果他们频繁发布记录并且争用率上升,这显然是性能下降。顺便说一句,这类似于 Disruptor框架工程。它是用于高频交易的高性能 Java(!) 并发框架。是的,我确实在同一句话中说了高性能 Java 和并发。对高性能并发设计和实现有很多有值(value)的见解。
关于c++ - 在多线程中跟踪对数据的引用(多少/谁),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8800288/
我是一名优秀的程序员,十分优秀!