首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >让线程本地队列具有计数器

让线程本地队列具有计数器
EN

Stack Overflow用户
提问于 2013-01-09 13:12:54
回答 1查看 633关注 0票数 1

我有四个线程,它们有自己的私有队列和私有的'int计数‘成员,每当从程序线程生成任务时,都应该将其排队到线程的队列,其中线程中的’int计数‘最小。

每当任务被推入队列时,当任务从队列中弹出时,私有'int计数‘应该增加1,而私有'int计数’应该减少1。

因此,“int计数”是关于任务推送、pop操作的动态更改,而程序线程将将任务分派给队列,其计数最低(或第一个零)。

这是程序的基本逻辑。

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

请您给出一些实现这一逻辑的编码思想。即。1.初始化所有私有int队列计数器=0

2.counter++当任务被推送时,

3.反--当任务出现时,

4.任务分发者查看每个线程的私有int计数。

5.将任务分派到具有最小计数的队列中。

EN

回答 1

Stack Overflow用户

发布于 2013-01-09 14:26:44

我有四个线程,它们有自己的私有队列和一个私有的'int *count‘成员,每当从程序线程生成任务时,我就不应该被排队到线程的队列中,线程之间的’int计数‘*最小。 每当任务被推入队列时,当任务从队列中弹出时,私有'int计数‘*应该增加1,*私有'int计数’应该减少1。

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

朴素的方法,因此您需要同步队列访问/增量,这意味着您需要一个mutex来阻止消费者在修改countqueue时访问任何东西。实现同步的最简单方法是有一个方法(E.G. enqueue(Item& item) ),该方法将mutex锁在其中。

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

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

C++11 :条件变量:variable

因此,“int计数”是动态地更改为任务*push、pop操作和程序线程将任务t*o调度到具有最低(或第一个零发现)计数的队列。

所以这里的情况有点复杂,因为您想要填充的线程是那些工作最少的线程。这要求您检查4 counts并选择队列。但是,由于只有一个生产者,所以您可能只需扫描队列而不需要锁定。这里的逻辑是,使用者不会受到读取的影响,即使使用者在选择线程的过程中工作,线程的选择也不会真的不正确。

因此,我有一个线程对象数组,每个线程对象都有计数,还有一个用于锁定的互斥对象。

1.初始化所有私有int队列计数器=0

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

当任务被推送时,*3. 2.counter++ --当任务被弹出时,*

在线程对象上实现两个方法来执行查询/脱队列,并在每个方法中使用一个lock_guard来锁定互斥对象(RAII技术)。然后将/pop项推到/从队列中,并在适用的情况下递增/减少。

C++11: lock_guard guard

4.任务分发者查看每个线程的私有int计数。*5.将任务分配到具有最小计数的队列中*

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

如果有多个线程产生工作,那么您可能需要考虑如何处理请求到同一个线程的2个线程(这可能无关紧要)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14235991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档