这是我在这里的第一篇文章,提前感谢您的宽容。
我有一个带有作业队列的线程池
工艺流程:
问题是同步点。我使用计数器和互斥锁实现了一个简单的信号量:在步骤2之前,计数器用要加载的任务数初始化,当每个任务完成时,计数器递减。如果counter==0,则我从工作线程发送pthread_cond_signal,步骤4中的pthrea德_cond_wait将捕获它。
我觉得这不是最有效的方法(我不喜欢在每个线程中锁定/解锁计数器减量,这是一个很大的开销,尤其是在任务负载很小的情况下),但我不知道如何改进。我知道存在障碍,但我不能在线程中使用pthread_barrier_wait,因为在同步事件发生之前,必须多次重用线程。
pthread_ spin_?即使队列为空,也不意味着线程没有运行——它们可能在最后M个任务上。我无法加入线程,因为它们将在下一个周期中重用。
如有任何意见/想法,我将不胜感激。非常感谢。
嗯,您可以通过使用原子减量指令而不是计数器上的内核锁来对其进行一些优化-然后将计数器减量为零的线程可以调用一些“OnComplete(something)”方法/函数,这些方法/函数可能会向原始线程发信号(就像您现在所做的那样)。
无论您如何设计队列和屏障/会合之类的东西,都不值得将琐碎的任务处理掉。无论如何,当您的原始线程进入等待状态时,以及当它在任务完成后再次运行时,通常会有两次上下文更改,如果池不忙并且池线程在队列中被阻塞,则会有更多更改。在完成计数上旋转会从您的CPU池中吸走一个内核——可能没有太大帮助,(尤其是如果您将池设计为并行运行一组以上的任务——则会有多个原始线程旋转)。
不要线程化CPU无关紧要的任务。如果有大量的CPU工作要做,或者任务执行阻塞操作,并且线程比内核多得多,那也没关系。
每个人我对使用线程池有一个误解。实际结果与该类的API描述不同。当我在线程池中使用时,它不重用线程,线程池等待构造函数中设置的KeepAliveTime,然后杀死这个线程并创建一个新线程。当我将KeepAliveTime设置为较小值时,比如1秒或更短,它会删除一个线程并重新创建它,但如果我设置一分钟,则不会创建新线程,因为不允许创建,队列已经满,所以所有任务都会被拒绝,但KeepAliveTime
如何从线程池中找到60%(或N%)的线程可用性?这背后的逻辑是什么? 父线程使用线程池线程生成多个网址,并等待所有子线程完成。 代码如下所示 父线程 子线程 用于跨线程通信的对象数据 在上述代码中,所需的线程硬编码为: 这种硬编码会导致线程池不足吗?如果线程池中没有可用的线程,会发生什么?如何在托管服务器的线程池中查找可用线程的总数? 谢谢。
本文向大家介绍Python多线程编程(六):可重入锁RLock,包括了Python多线程编程(六):可重入锁RLock的使用技巧和注意事项,需要的朋友参考一下 考虑这种情况:如果一个线程遇到锁嵌套的情况该怎么办,这个嵌套是指当我一个线程在获取临界资源时,又需要再次获取。 根据这种情况,代码如下: 这种情况的代码运行情况如下: 之后就直接挂起了,这种情况形成了最简单的死锁。 那有没有一种情况可以在某
问题内容: 我刚刚开始研究Java的类和方法。根据API,生成的线程池将现有对象重用于新任务。 我对此感到有些困惑,因为我无法在API中找到任何方法来设置现有对象的行为。 例如,您可以创建一个 新的 从一个对象,这使得调用的方法。但是,API中没有使用a 作为参数的setter方法。 我将不胜感激任何指针。 问题答案: 执行人员在后台为您完成所有工作。是的,它仅使用现有的线程API。 下面的链接提
我刚刚开始研究Java的类和方法。根据API,生成的线程池重用现有的对象来执行新任务。 我有点困惑这是如何实现的,因为我在API中找不到任何方法可以设置现有对象的行为。 例如,可以从对象创建新的,这使得调用的方法。但是,API中没有将作为参数的setter方法。 我会很感激你的指点。
本文向大家介绍C# 线程同步的方法,包括了C# 线程同步的方法的使用技巧和注意事项,需要的朋友参考一下 一、进程内部的线程同步 1、使用lock,用法如下: 特性:只能传递对象,无法设置等待超时 2、使用:InterLocked(原子操作) 其在System.Threading命名空间下,Interlocked实际是类控制计数器,从而实现进程的同步,其很容易实现生产者消费者模型 3、使用Monit