好的…我已经给了这个网站一个公平的search,并且阅读了很多关于这个主题的文章。 我发现这个问题: 在C#中的简单线程池代码特别有用。 不过,就像看起来一样,我需要的东西稍有不同。 我已经看了MSDN的例子,并适应了我的需求。 我提到的例子是在这里: http : //msdn.microsoft.com/en-us/library/3dasc8as(VS.80,printer).aspx 我的问题是这个。 我有一个相当简单的代码集,通过HttpWebRequest和WebResponse类加载网页,并通过Stream读取结果。 我在线程中引发这个方法,因为它需要执行很多次。 该方法本身很短,但它需要被触发的次数(每次不同的数据)是不同的。 它可以是从1到200的任何地方。 我读过的所有东西似乎都表明ThreadPool类是主要的候选者。 这是棘手的事情。 我可能需要说这个东西说100次,但我最多只能有3个线程运行(为这个特定的任务)。 我已经尝试通过设置ThreadPool上的MaxThreads : ThreadPool.SetMaxThreads(3, 3); 我不完全相信这种方法正在工作。 此外,我不想闯入系统上运行的其他网站或程序,这将运行。 所以,通过限制ThreadPool上的ThreadPool ,我可以确定这只适用于我的代码和我的线程吗? MSDN示例使用事件驱动方法并调用WaitHandle.WaitAll(doneEvents); 这是我如何做到这一点。 所以我的问题的核心是,如何确保或指定可以为其代码运行的线程的最大数量,但代码继续运行更多的线程,因为以前的完成,直到任意点? 我正确的解决这个问题吗? 此致 贾森 好吧,我已经添加了一个信号量方法,并完全删除了ThreadPool代码。 这似乎很简单。 我从我的信息: http : //www.albahari.com/threading/part2.aspx 这个例子向我展示了如何: [下面的文本是从网站复制/粘贴] 一个容量为1的Semaphore与一个Mutex或lock相似,只是Semaphore没有“所有者” – 它是线程无关的。 任何线程都可以在Semaphore上调用Release ,而在使用Mutex和lock ,只有获取资源的线程才能释放它。 在下面的例子中,十个线程在中间执行一个Sleep语句的循环。 Semaphore确保一次不超过三个线程可以执行该Sleep语句: class SemaphoreTest { static Semaphore s = new […]
有人可以请解释什么是每个请求的线程和每个连接线程? servlet的工作模式是什么? 如何分配线程来处理HTTP请求? 它是线程/请求还是连接? 假设我想要在Servlet的doGet()方法中asynchronous执行耗时的任务,我使用Java执行程序启动一个新的线程,以便在一个单独的线程中完成冗长的计算,并立即发送响应。 现在是否确保我已经释放了处理我的HttpServletRequest的线程,还是仍在使用,因为子线程仍在运行?
我使用ThreadLocal 在我的Java类中,我有时使用ThreadLocal作为避免不必要的对象创build的手段: @net.jcip.annotations.ThreadSafe public class DateSensitiveThing { private final Date then; public DateSensitiveThing(Date then) { this.then = then; } private static final ThreadLocal<Calendar> threadCal = new ThreadLocal<Calendar>() { @Override protected Calendar initialValue() { return new GregorianCalendar(); } }; public Date doCalc(int n) { Calendar c = threadCal.get(); c.setTime(this.then): // use n to mutate c return […]
什么是一个好的开源的C ++线程池实现在生产代码(类似boost)? 请提供您自己的示例代码或示例代码使用情况的链接。
我一直在阅读有关线程池模式,我似乎无法find以下问题的通常解决scheme。 我有时想让任务连续执行。 例如,我从文件中读取文本块,出于某种原因,我需要按照该顺序处理块。 所以基本上我想要消除一些任务的并发性。 考虑这种情况,带*的任务需要按照它们的顺序进行处理。其他任务可以按任意顺序处理。 push task1 push task2 push task3 * push task4 * push task5 push task6 * …. and so on 在一个线程池的上下文中,没有这个约束,一个待处理任务的队列工作正常,但是在这里显然没有。 我想过让一些线程在一个线程特定的队列上运行,其他的在“全局”队列上运行。 然后,为了连续执行一些任务,我只需将它们推送到单个线程所在的队列中。 这听起来有点笨拙。 所以,在这个漫长的故事中真正的问题是:你将如何解决这个问题? 你将如何确保这些任务是有序的 ? 编辑 作为一个更普遍的问题,假设上面的情况变成了 push task1 push task2 ** push task3 * push task4 * push task5 push task6 * push task7 ** push task8 * […]
在我的一个项目中,这是一个聚合器,我从网上parsing源,播客等等。 如果我使用顺序方法,考虑到大量资源,处理所有资源需要相当长的时间(由于networking问题和类似的东西); foreach(feed in feeds) { read_from_web(feed) parse(feed) } 所以我想要实现并发性,并不能决定是否应该基本上使用ThreadPools来处理工作线程或只是依靠TPL来进行sorting。 ThreadPools肯定会用工作线程来处理我的工作,我会得到我所期望的(在多核CPU环境下,其他核心也将被使用)。 但是我仍然想考虑TPL,因为它是推荐方法,但我有点担心。 首先我知道TPL使用ThreadPools,但增加了额外的决策层。 我主要关心的是单核环境存在的情况。 如果我没有错,TPL从一开始就有一个数字的工作线程开始,等于可用CPU内核的数量。 我害怕TPL在序列方法上产生类似的结果,这是我的IO界限的情况。 所以对于IO绑定的操作(在我的情况下,从网上读取资源),是最好使用ThreadPools和控制的东西,或者更好的只是依靠TPL? TPL也可以用于IO界限的情况吗? 更新 :我主要关心的是 – 在单核CPU环境下,TPL只是performance得像顺序方法,还是会提供并发性? 我已经阅读了与Microsoft .NET并行编程,所以这本书,但无法find一个确切的答案。 注意:这是我以前的问题的重新措辞[ 是否可以一起使用线程并发和并行? ]这是错误的措词。
它与这个问题松散地相关: std :: thread是在C ++ 11中汇集的吗? 。 虽然问题不同,但意图是一样的: 问题1:使用自己的(或第三方库)线程池以避免代价高昂的线程创build仍然有意义吗? 在另一个问题的结论是,你不能依靠std::thread汇集(它可能或可能不)。 然而, std::async(launch::async)似乎有更高的机会被汇集。 它不认为这是由标准强制的,但恕我直言,我希望所有好的C ++ 11实现将使用线程池,如果线程创build速度慢。 只有在创build新线程便宜的平台上,我才会期望它们总是产生一个新的线程。 问题2:这只是我的想法,但我没有事实可以certificate。 我很可能是错的。 这是一个受过教育的猜测吗? 最后,在这里,我提供了一些示例代码,首先显示了我认为线程创build可以通过async(launch::async) : 例1: thread t([]{ f(); }); // … t.join(); 变 auto future = async(launch::async, []{ f(); }); // … future.wait(); 示例2:启动并忘记线程 thread([]{ f(); }).detach(); 变 // a bit clumsy… auto dummy = async(launch::async, []{ f(); […]
[ThreadStatic]属性如何工作? 我假定编译器会发出一些IL来填充/检索TLS中的值,但是看起来反汇编似乎并不是在这个层次上做的。 作为一个后续,如果你把它放在非静态成员上会发生什么? 我们有一个开发者犯了这个错误,编译器甚至没有提出警告。 更新 第二个问题在这里回答: ThreadStatic用静态C#
下面有什么区别 ThreadPool.QueueUserWorkItem VS Task.Factory.StartNew 如果上面的代码被称为500次的一些长时间运行的任务是否意味着所有的线程池线程将被占用? 或者TPL(第二选项)是否足够聪明,可以占用less于或等于处理器数量的线程?
假设我们在一个QObject派生类中写了一个非const方法: class MyClass : public QObject { int x; public: void method(int a) { x = a; // and possibly other things }; }; 我们想让这个方法是线程安全的:意味着从一个任意的线程和多个线程同时调用它,不应该引入未定义的行为。 Qt提供哪些机制/ API来帮助我们使这个方法成为线程安全的? 当方法执行“其他事情”时,来自Qt的什么机制/ API可以使用? 是否有任何分类可能的“其他事情”,可以告诉什么Qt特定的机制/ API使用? 脱离主题是由C ++标准本身提供的机制,以及确保线程安全的通用/非Qt特定方法。