gpt4 book ai didi

c++ - 在多线程中跟踪对数据的引用(多少/谁)

转载 作者:行者123 更新时间:2023-11-30 01:27:32 25 4
gpt4 key购买 nike

我在多线程中遇到了一个问题,多线程的模型是 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 集中线程的引用。

问题

  1. 如果主缓存中有 200 万条记录,则相等InUseCounter 的数量,因此互斥变量,在一个进程中使用 200 万个互斥变量是否明智。
  2. 拥有庞大的单一数据结构来维护 InUseCounter 将导致更多的锁定时间来查找和递减
  3. 什么是我查找引用文献的最佳替代方法,以及谁都有锁定时间非常短的引用。

预先感谢您的建议。

最佳答案

  1. 200 万个互斥量有点多。即使是轻量级的锁,他们仍然占用一些开销。
  2. InUseCounter 放在一个结构中最终会导致线程之间在释放记录时争用;如果线程不同步执行,这可能可以忽略不计。如果他们频繁发布记录并且争用率上升,这显然是性能下降。
  3. 您可以通过让一个线程负责维护记录引用计数(生产者线程)并让其他线程通过单独的队列发回记录释放事件来提高性能,实际上,将生产者转变为记录释放事件消费者.当您需要刷新条目时,首先处理所有释放队列,然后运行您的释放逻辑。您将需要处理一些延迟,因为您现在正在排队发布事件而不是尝试立即处理它们,但性能应该好得多。

顺便说一句,这类似于 Disruptor框架工程。它是用于高频交易的高性能 Java(!) 并发框架。是的,我确实在同一句话中说了高性能 Java 和并发。对高性能并发设计和实现有很多有值(value)的见解。

关于c++ - 在多线程中跟踪对数据的引用(多少/谁),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8800288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com