gpt4 book ai didi

c++ - 使 Thread 本地队列带有计数器

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:23 31 4
gpt4 key购买 nike

我有四个线程,它们有自己的私有(private)队列和一个私有(private)的'int count'成员,无论何时从程序线程中产生一个任务,它都应该排入一个线程的队列中,该队列具有最小值线程之间的“int 计数”。

每当一个任务被插入队列时,私有(private)'int count'应该增加1每当任务从队列中弹出时,私有(private)“int count”应该减 1

因此,'int count' 是关于任务推送、弹出操作的动态变化,程序线程会将任务分派(dispatch)到具有最低计数(或找到的第一个零)的队列。

这是程序的底层逻辑。

我在 linux 多线程库中使用 c++ 编程语言实现多速率同步数据流范例。

能否请您提供一些实现此逻辑的编码思路。 IE。1.初始化所有private int队列计数器=0

2.counter++ 任务推送时,

3.counter--任务弹出时,

4.Task disptacher查看每个线程的private int计数。

5.将任务分派(dispatch)到具有最小计数的队列

最佳答案

I have four threads which has its own private queue and a private'int *count' member, whenever a task is produced from the program thread, i*t should be enqueued to a thread's queue which has minimum 'int count' *among the threads.*

whenever a task is pushed into the queue, the private 'int count' *should be increased by 1 whenever a task is popped out of the queue,* the private 'int count' should be decreased by 1

好的,所以基本上您的程序线程是生产者,您有 4 个消费者线程。通过在每个线程中使用一个队列,您将最大限度地减少主线程与消费者交互所花费的时间。 N.B. 您需要考虑您的线程是否会饿死/或溢出 - I.E.如果单个生产者将以保证 4 个消费者的速度创造“作品”,或者 4 个消费者将被淹没。

天真的方法因此,您需要同步队列访问/增量,这意味着您需要一个 mutex 来阻止消费者在修改 countqueue 时访问任何内容.最简单的同步方法是使用一种方法(例如 enqueue(Item& item) )将 mutex 锁定在其中。

C++11:互斥锁 http://en.cppreference.com/w/cpp/thread/mutex

此外,如果饥饿是一个问题(或溢出),您将需要使用一些信号来停止相关线程事件(饥饿 - 停止消费者以避免 CPU 使用,溢出 - 停止生产者,而消费者 catch )。通常这些信号是使用条件变量实现的。

C++11:条件变量:http://en.cppreference.com/w/cpp/thread/condition_variable

so, the 'int count' is dynamically changing regarding to tasks *push,pop operation and the program thread will dispatch the task t*o the queue with the lowest, (or first zero found), count.

所以这里的情况有点复杂,因为您要填充的线程将是工作量最少的线程。这需要您检查 4 个 counts 并选择队列。 但是因为只有一个生产者,你可能可以在不锁定的情况下扫描队列。这里的逻辑是消费者不会受到读取的影响,即使消费者在选择期间工作,线程的选择也不会真的不正确。

所以我会有一个线程对象数组,每个线程对象都有计数和一个用于锁定的互斥量。

1.Initializing all private int queue counter =0

在构造函数中初始化计数 - 确保生产者在初始化期间不工作,同步不会成为问题。

2.counter++ when task are pushed, *3.counter-- when tasks are popped,*

在线程对象上实现 2 个方法来进行入队/出队,并在每个方法中使用 lock_guard 来锁定互斥量(RAII 技术)。然后将项目插入/弹出队列并根据需要递增/递减。

C++11:lock_guard http://en.cppreference.com/w/cpp/thread/lock_guard

4.Task disptacher sees the private int count of each thread. *5.Dispatches tasks to queue which has minimum count*

正如我上面所说,如果只有一个,您可以简单地扫描对象数组并选择(维护一个索引)计数器所在的线程对象(添加一个 getCount() 方法)是最低的。即使消费者继续工作,它也很可能是最低的。

如果有多个线程产生工作,那么您可能需要考虑如何处理两个线程对同一个线程的查询(这可能无关紧要)

关于c++ - 使 Thread 本地队列带有计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14235991/

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