Questions tagged «multithreading»

多线程是计算机或程序通过利用多个并发的执行流(通常称为线程)来并发或异步执行工作的能力。

5
iOS启动后台线程
我的iOS设备中有一个小sqlitedb。当用户按下按钮时,我从sqlite获取数据并将其显示给用户。 我要在后台线程中执行此操作(不阻塞UI主线程)。我这样做- [self performSelectorInBackground:@selector(getResultSetFromDB:) withObject:docids]; 经过提取和一些处理后,我需要更新UI。但是由于(作为一种好习惯),我们不应该从后台线程执行UI更新。我selector这样在主线程上调用- [self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO]; 但是我的应用程序在第一步中崩溃了。即启动后台线程。这不是在iOS中启动后台线程的方法吗? 更新1:在[self performSelectorInBackground....获得此stacktrace之后,再也没有任何信息- 更新2:我什至尝试启动这样的后台线程- [NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];但仍然得到相同的stacktrace。 就像我澄清的那样,当我在主线程上执行此操作时,一切运行顺利... 更新3这是我试图从后台运行的方法 - (void)getResultSetFromDB:(NSMutableArray *)toProceessDocids { SpotMain *mirror = [[SpotMain alloc] init]; NSMutableArray *filteredDocids = toProceessDocids; if(![gMediaBucket isEqualToString:@""]) filteredDocids = [mirror FetchDocIdsForMediaBucketWithDocID:filteredDocids mBucket:gMediaBucket numRes:-1]; if(![gMediaType isEqualToString:@""]) filteredDocids = [mirror FetchDocIdsForMediaType:filteredDocids mediaType:gMediaType numRes:-1]; …

1
为了避免昂贵的线程创建,C ++ 11中的async(launch :: async)是否会使线程池过时?
它与以下问题大致相关:std :: thread是否在C ++ 11中池化?。尽管问题有所不同,但目的是相同的: 问题1:使用自己的(或第三方库)线程池来避免创建昂贵的线程是否仍然有意义? 另一个问题的结论是,您不能依靠std::thread被池化(它可能会也可能不会)。但是,std::async(launch::async)似乎有更高的机会被合并。 它不认为这是标准的强制要求,但是恕我直言,我希望所有好的C ++ 11实现都可以在线程创建缓慢的情况下使用线程池。我希望仅在廉价的平台上创建新线程,我希望它们总是产生新线程。 问题2:这就是我的想法,但我没有事实可以证明。我很可能会误会。这是有根据的猜测吗? 最后,在这里,我提供了一些示例代码,这些代码首先显示了我认为如何通过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(); }); // ... but …

9
非阻塞I / O真的比多线程阻塞I / O快吗?怎么样?
我在网上搜索了有关阻止I / O和非阻止I / O的一些技术细节,我发现一些人指出,非阻止I / O比阻止I / O更快。例如在本文档中。 如果我使用阻塞I / O,那么当前被阻塞的线程当然不能做任何其他事情……因为它被阻塞了。但是,一旦某个线程开始被阻塞,操作系统就可以切换到另一个线程,而不必切换回另一个线程,直到对该阻塞的线程有必要做些事情为止。因此,与基于事件的非阻塞方法相比,只要系统上还有另一个线程需要CPU并且未被阻塞,那么CPU空闲时间就不会更多了? 除了减少CPU空闲时间以外,我还看到了另一个选择,可以增加计算机在给定时间范围内可以执行的任务数量:减少切换线程带来的开销。但是如何做到这一点?开销是否足够大以显示可衡量的效果?这是关于如何描述其工作原理的想法: 要加载文件的内容,应用程序将此任务委托给基于事件的I / O框架,并传递回调函数和文件名。 事件框架委托给操作系统,该操作系统对硬盘的DMA控制器进行编程,以将文件直接写入内存 事件框架允许进一步的代码运行。 在完成磁盘到内存的复制后,DMA控制器将引起中断。 操作系统的中断处理程序将基于事件的I / O框架通知文件已完全加载到内存中。它是如何做到的?使用信号?? 事件I / O框架中当前运行的代码完成。 基于事件的I / O框架检查其队列,并查看步骤5中的操作系统消息,并执行在步骤1中获得的回调。 那是怎么回事?如果没有,它如何工作?这意味着事件系统可以工作而无需显式地触摸堆栈(例如,真正的调度程序需要在切换线程时备份堆栈并将另一个线程的堆栈复制到内存中)?这实际上节省了多少时间?还有更多吗?

6
GCD中的并发与串行队列
我正在努力完全理解GCD中的并发和串行队列。我遇到了一些问题,希望有人能及时明确地回答我。 我正在阅读串行队列的创建和使用,以便依次执行任务。但是,如果发生以下情况,会发生什么情况: 我创建一个串行队列 我使用dispatch_async了3次(在我刚刚创建的串行队列中)分配了三个块A,B,C 将执行以下三个块: 按顺序A,B,C,因为队列是串行的 要么 并发(同时在并行线程上),因为我使用了ASYNC调度 我读到我可以dispatch_sync在并发队列上使用,以便一个接一个地执行块。在那种情况下,为什么甚至不存在串行队列,因为我始终可以使用并发队列,在该队列中可以同步分配任意数量的块? 感谢您的任何解释!

5
如何使用CancellationToken属性?
与前面的RulyCanceler类代码相比,我想使用来运行代码 CancellationTokenSource。 如取消令牌中所述,如何使用它,即不引发/捕捉异常?我可以使用IsCancellationRequested财产吗? 我试图这样使用它: cancelToken.ThrowIfCancellationRequested(); 和 try { new Thread(() => Work(cancelSource.Token)).Start(); } catch (OperationCanceledException) { Console.WriteLine("Canceled!"); } 但这cancelToken.ThrowIfCancellationRequested();在方法中产生了运行时错误Work(CancellationToken cancelToken): System.OperationCanceledException was unhandled Message=The operation was canceled. Source=mscorlib StackTrace: at System.Threading.CancellationToken.ThrowIfCancellationRequested() at _7CancellationTokens.Token.Work(CancellationToken cancelToken) in C:\xxx\Token.cs:line 33 at _7CancellationTokens.Token.<>c__DisplayClass1.<Main>b__0() in C:\xxx\Token.cs:line 22 at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, …

6
提高boost_shared_mutex的示例(多次读取/一次写入)?
我有一个多线程应用程序,该应用程序必须经常读取一些数据,并偶尔更新数据。现在,互斥锁可以确保对数据的安全访问,但是这很昂贵,因为我希望多个线程能够同时读取,并且仅在需要更新时才将它们锁定(更新线程可以等待其他线程完成)。 。 我认为这是boost::shared_mutex应该做的,但是我不清楚如何使用它,也没有找到明确的例子。 有人有我可以用来入门的简单示例吗?


7
PyQt应用程序中的线程:使用Qt线程还是Python线程?
我正在编写一个GUI应用程序,该应用程序通过Web连接定期检索数据。由于此检索需要一段时间,因此会导致UI在检索过程中无响应(无法拆分成较小的部分)。这就是为什么我想将Web连接外包给单独的工作线程。 [是的,我知道,现在我有两个问题。] 无论如何,该应用程序使用PyQt4,所以我想知道更好的选择是:使用Qt的线程还是使用Python threading模块?各自的优点/缺点是什么?还是您有完全不同的建议? 编辑(赏金):虽然在我的特定情况下,解决方案可能会使用非阻塞网络请求,例如Jeff Ober和LukášLalinský建议的(所以基本上将并发性问题留给了网络实现),但我仍然想要更多深入回答一般问题: 与本地Python线程(来自threading模块)相比,使用PyQt4(即Qt)线程有什么优缺点? 编辑2:谢谢大家的回答。尽管没有达成100%的协议,但似乎普遍的共识是答案是“使用Qt”,因为这样做的优点是可以与库的其余部分集成,而不会造成任何实际的缺点。 对于希望在这两种线程实现之间进行选择的任何人,我强烈建议他们阅读此处提供的所有答案,包括方丈链接到的PyQt邮件列表线程。 我考虑了一些悬赏的答案;最后,我选择了方丈作为非常相关的外部参考;然而,这是一个密切的电话。 再次感谢。

3
什么是线程退出代码?
调试时“输出”窗口中的线程退出代码到底是什么?它给我什么信息?它以某种方式有用吗,还是只是一个不应该打扰我的内部东西? The thread 0x552c has exited with code 259 (0x103). The thread 0x4440 has exited with code 0 (0x0). 是否存在某种可能的退出代码列表及其重要性?

9
正确使用.NET MemoryCache的锁定模式
我认为这段代码存在并发问题: const string CacheKey = "CacheKey"; static string GetCachedData() { string expensiveString =null; if (MemoryCache.Default.Contains(CacheKey)) { expensiveString = MemoryCache.Default[CacheKey] as string; } else { CacheItemPolicy cip = new CacheItemPolicy() { AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddMinutes(20)) }; expensiveString = SomeHeavyAndExpensiveCalculation(); MemoryCache.Default.Set(CacheKey, expensiveString, cip); } return expensiveString; } 并发问题的原因是多个线程可以获取空键,然后尝试将数据插入缓存。 进行此代码并发证明的最短,最干净的方法是什么?我喜欢在与缓存相关的代码中遵循良好的模式。链接到在线文章会很有帮助。 更新: 我根据@Scott Chamberlain的答案提出了此代码。有人能找到与此相关的任何性能或并发问题吗?如果可行,它将节省很多代码和错误。 …

2
Java多线程环境中的静态方法行为
有一个简单的愚蠢问题困扰着我,并在我脑海中提出了几个论点。我想排除所有关于以下问题的疑问。 class Clstest{ public static String testStaticMethod(String inFileStr) { // section 0 // section 1 // do something with inFileStr // section 2 // section 3 return inFileStr; } } 假设有五个线程同时执行一个调用Clstest.testStaticMethod("arg-n")。 线程1调用Clstest.testStaticMethod("arg-1")。 当线程1位于第1节中时,线程2调用Clstest.testStaticMethod("arg-2")。 那么线程1将会发生什么?会进入睡眠状态吗? 当线程1获得机会时,它将从暂停的第1节继续执行吗? 当所有五个线程共享一个Clstest.testStaticMethod相同的Clstest.testStaticMethod线程时,如何处理? 有可能互换inFileStr多个线程发送的消息吗?


1
NSDefaultRunLoopMode与NSRunLoopCommonModes
每当我尝试下载一个大文件的背后UIScrollView,MPMapView或者什么的,下载过程被当我触摸iPhone屏幕停止。值得庆幸的是,Jörn的一篇很棒的博客文章提出了一种替代方法,NSRunLoopCommonModes用于连接。 这让我详细了解了两种模式,即NSDefaultRunLoopMode和NSRunLoopCommonModes,但是苹果文档并没有详细说明,除了说 NSDefaultRunLoopMode 处理NSConnection对象以外的输入源的模式。这是最常用的运行循环模式。 NSRunLoopCommonModes 使用此值作为模式添加到运行循环的对象由已声明为“公共”模式集的成员的所有运行循环模式监视;有关详细信息,请参见CFRunLoopAddCommonMode的描述。 CFRunLoopAddCommonMode 源,计时器和观察者被注册到一个或多个运行循环模式,并且仅在运行循环以其中一种模式运行时运行。通用模式是一组运行循环模式,您可以为其定义一组由这些模式共享的源,计时器和观察器。例如,您无需将源注册到每个特定的运行循环模式,而只需将其注册到运行循环的公共伪模式一次,它将在公共模式集中的每个运行循环模式下自动注册。同样,当将一种模式添加到一组公共模式时,任何已注册到该公共伪模式的源,计时器或观察者都将添加到新添加的公共模式中。 谁能用人类语言解释两者吗?


4
AsyncTask线程永不消亡
我正在使用 AsyncTask s来获取数据,以响应用户按下按钮。这样可以很好地工作,并在获取数据时使接口保持响应,但是当我检查Eclipse调试器中发生的情况时,我发现每次AsyncTask创建新程序时(这很常见,因为它们只能使用一次) ),正在创建一个新线程,但从未终止。 结果是大量 AsyncTask线程就坐在那儿。我不确定这在实践中是否存在问题,但是我真的很想摆脱那些多余的线程。 如何杀死这些线程?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.