Tag: multithreading

等待池线程完成

我很抱歉有一个多余的问题。 不过,我发现了很多解决scheme,但没有一个解释得很好。 我希望在这里可以明确说明。 我的C#应用​​程序的主线程产生1..n使用ThreadPool的后台工作人员。 我希望原始的线程locking,直到所有的工人完成。 我特别研究了ManualResetEvent,但是我不清楚它的用途。 在伪: foreach( var o in collection ) { queue new worker(o); } while( workers not completed ) { continue; } 如有需要,我会知道将要排队的工人数量。

在UITableView中更改AVPlayer的playerItem

我有一个UITableView包含滚动时播放的video数量。 当tableView中的单元格被重新使用时,我只为每一行实例化一个AVPlayer 。 当一个单元格被重新使用时,我只需通过调用[self.player replaceCurrentItemWithPlayerItem:newItem];来更改单元格玩家的[self.player replaceCurrentItemWithPlayerItem:newItem]; 。 这是目前正在间接调用tableView:cellForRowAtIndexPath 。 当向下滚动时,重新使用时会有明显的滞后。 通过一个消除的过程,我已经得出结论,滞后是由replaceCurrentItemWithPlayerItem ,甚至开始播放之前造成的。 当删除这一行代码(防止玩家获得一个新的video),滞后消失。 我试图解决它: 我有一个自定义的UITableViewCell播放这些video,我已经创build了一个方法来初始化来自对象的新信息。 IE,在cellForRowAtIndexPath:我调用[cell initializeNewObject:newObject]; 执行以下方法: //In CustomCell.m -(void)initializeNewObject:(CustomObject*)newObject { /*…*/ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ AVPlayerItem *xPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:newObject.url]]; AVPlayer *dummy = self.player; [dummy replaceCurrentItemWithPlayerItem:xPlayerItem]; dispatch_async(dispatch_get_main_queue(), ^{ self.player = dummy; playerItem = xPlayerItem; } }/*…*/ } 当运行这个,我得到了相同的结果,如果我完全删除了更换项目的呼叫。 显然,这个函数不能被线程化。 我并不完全确定我对此的期望。 我会想象我需要一个干净的AVPlayer这个工作copy ,但search了一下之后,我发现了几个意见,指出replaceCurrentItemWithPlayerItem: […]

SwitchToThread / Thread.Yield与Thread.Sleep(0)与Thead.Sleep(1)

我试图编写最终的“收益率”方法来产生当前时间片到其他线程。 到目前为止,我发现有几种不同的方法可以使线程产生分配的时间片。 我只是想确保我正确解释他们,因为文件不是很清楚。 所以,从我读到的stackoverflow,MSDN和各种博客文章,下面的选项存在,都有不同的优点/缺点: SwitchToThread [win32] / Thread.Yield [.NET 4 Beta 1]:产生到同一处理器上的任何线程 优点:大约是Thread.Sleep(0)两倍 缺点:只产生同一个处理器上的线程 Thread.Sleep(0) :产生任何处理器上相同或更高优先级的线程 优点:比Thread.Sleep(1)更快Thread.Sleep(1) 缺点:只产生相同或更高优先级的线程 Thread.Sleep(1) :产生任何处理器上的任何线程 优点:屈服于任何处理器上的任何线程 缺点:最慢的选项(如果不使用timeBeginPeriod / timeEndPeriod [win32], Thread.Sleep(1)通常会挂起线程大约15ms) 那么Thread.SpinWait呢? 可以用来产生线程的时间片吗? 如果不是,它用于什么? 我还有一些我错过了或错误解释的东西。 如果你能改正/补充我的理解,我将不胜感激。 这是我的Yield方法迄今为止的样子: public static class Thread { [DllImport("kernel32.dll")] static extern bool SwitchToThread(); [DllImport("winmm.dll")] internal static extern uint timeBeginPeriod(uint period); [DllImport("winmm.dll")] internal static extern uint timeEndPeriod(uint […]

multithreading是否强调内存碎片?

描述 当使用openmp的parallel构造来分配和释放具有4个或更multithreading的随机大小的内存块时,程序似乎开始在testing程序的运行时间的后半部分泄漏大量的内存。 因此,它将消耗的内存从1050 MB增加到1500 MB或更多,而实际上并没有使用额外的内存。 由于valgrind没有显示任何问题,我必须假设内存泄漏实际上是内存碎片的强调效果。 有趣的是,如果2个线程每个分配10000个分配,效果不会显示,但是如果4个线程分别分配5000个分配,则效果会很强。 另外,如果分配的块的最大大小减less到256kb(从1mb),效果变弱。 重型并发可以强调分割吗? 或者这更可能是一个堆中的错误? testing程序说明 演示程序的构build是为了从堆中获取总共256 MB的随机大小的内存块,并进行5000次分配。 如果内存限制被触发,首先分配的块将被释放,直到内存消耗降到限制以下。 一旦执行了5000个分配,所有的内存都被释放,循环结束。 所有这些工作都是由openmp生成的每个线程完成的。 这种内存分配scheme允许我们预计每个线程(包括一些簿记数据)的内存消耗约为260 MB。 演示程序 由于这真的是你可能想要testing的东西,所以你可以用一个简单的makefile从下拉框下载示例程序。 按原样运行程序时,应该至less有1400 MB的RAM可用。 随意调整代码中的常量以满足您的需求。 为了完整,实际的代码如下: #include <stdlib.h> #include <stdio.h> #include <iostream> #include <vector> #include <deque> #include <omp.h> #include <math.h> typedef unsigned long long uint64_t; void runParallelAllocTest() { // constants const int NUM_ALLOCATIONS = 5000; // alloc's […]

使用C#/ .NET分析工具来查找竞争状态/死锁

有没有一个分析.NET代码和发现竞争条件的工具? 我有一些代码有一个公共静态属性获取或创build一个私人静态字段。 它也有一个公共的静态方法,将该字段设置为null(…是的,我知道!) 由于这两种方法都没有锁,所以可以肯定的是,将来事情会变得非常糟糕。 我需要一个工具recursion地通过调用这些方法之一的东西,看看是否有任何东西在另一个线程上产生。 我正在寻找一个工具或者nDepend SQL脚本(如果这是可能的话)。

哪个std :: async实现使用线程池?

使用std::async而不是手动创buildstd::thread对象的好处之一就是std::async可以在封面下使用线程池来避免超额订阅的问题。 但是,哪些实现这样做? 我的理解是微软的实现,但这些其他的async实现呢? Gnu的libstdc ++ Gnu的libc ++ Just Software的图书馆 升压(对于boost::thread::async ,而不是std::async ) 感谢您提供的任何信息。

我在哪里可以find一个关于iPhone / Objective-Cmultithreading的好教程?

我刚刚开始使用multithreading,并正在寻找一个很好的解释。 我不确定multithreading在Mac和iPhone上的工作方式是否存在差异。 什么是与示例代码教程的良好链接?

浏览器会给JavaScript一个单独的线程吗?

网页浏览器是否使用iframe中的JavaScript执行线程? 我相信Chrome为每个选项卡使用单独的线程,所以我猜测,iframe中的JavaScript将与其父窗口共享相同的线程,但是,这似乎也是一个安全风险。

MemoryCache线程安全,locking是必要的?

对于初学者,让我把它扔出去,我知道下面的代码是不是线程安全的(更正:可能)。 我所苦苦挣扎的是find一个实现,一个实际上我可以在testing中失败的实现。 我正在重构一个大的WCF项目,它需要一些(大部分)静态数据caching,并从SQL数据库填充它。 它需要过期,至less每天“刷新”一次,这就是为什么我使用MemoryCache。 我知道,下面的代码不应该是线程安全的,但我不能让它在重负载下失败,并使谷歌search显示实现两个方面的事情复杂化(有和没有锁结合辩论,无论它们是否有必要。 是否可以在multithreading环境中使用MemoryCache的知识,让我明确知道是否需要在适当的位置locking,以便在检索/重新填充期间移除调用(很less被调用但是它的一个要求)不会被抛出。 public class MemoryCacheService : IMemoryCacheService { private const string PunctuationMapCacheKey = "punctuationMaps"; private static readonly ObjectCache Cache; private readonly IAdoNet _adoNet; static MemoryCacheService() { Cache = MemoryCache.Default; } public MemoryCacheService(IAdoNet adoNet) { _adoNet = adoNet; } public void ClearPunctuationMaps() { Cache.Remove(PunctuationMapCacheKey); } public IEnumerable GetPunctuationMaps() { if (Cache.Contains(PunctuationMapCacheKey)) { […]

如何在Linux中命名一个线程?

我有一个用C / C ++编写的multithreadingLinux应用程序。 我select了我的线程名称 。 为了帮助debugging,我希望这些名字在GDB,“top”等中可见。这是可能的,如果是的话,怎么样? (有足够的理由知道线程名称,现在我想知道哪个线程占用了50%的CPU(由'top'报告),而且在debugging时我经常需要切换到另一个线程 – 目前我必须做“ thread apply all bt ”,然后通过backtrace输出页面来查找正确的线程)。 Windows解决scheme在这里 ; 什么是Linux的?