1

我有四个线程,它们有自己的私有队列和一个私有的“ int count ”成员,每当从程序线程产生一个任务时,它应该被排入线程中具有最小“int count”的线程队列。

每当任务被推入队列时,私有“int count”应该增加1每当任务从队列中弹出时,私有“int count”应该减少1

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

这是程序的底层逻辑。

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

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

2.counter++ 推送任务时,

3.counter——任务弹出时,

4.Task Disptacher 看到每个线程的私有 int 计数。

5.调度任务到具有最小计数的队列

4

1 回答 1

2

我有四个线程,它们有自己的私有队列和一个私有的'int *count'成员,每当从程序线程产生一个任务时,i*t 应该被排入一个线程的队列中,其中具有最小的'int count' *线程。*

每当一个任务被推入队列时,私有“int count” *应该在任务从队列中弹出时增加1,* 私有“int count”应该减少1

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

天真的方法 因此您需要同步队列访问/增量,这意味着您需要在修改和mutex时停止消费者访问任何内容。最简单的方法是进行同步是有一个方法(EG )来锁定它。countqueueenqueue(Item& item)mutex

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

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

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

因此,关于任务 *push、pop 操作,“int count”是动态变化的,并且程序线程会将任务分派到 具有最低计数(或第一个找到的零)的队列中。

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

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

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

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

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

在线程对象上实现 2 个方法来进行入队/出队,并在每个方法中使用 lock_guard 来锁定互斥锁(RAII 技术)。然后将项目推入/从队列中推入/弹出,并酌情增加/减少。

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

4.Task Disptacher 看到每个线程的私有 int 计数。 *5.将任务分派到具有最小计数的队列*

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

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

于 2013-01-09T14:26:44.813 回答