根据C ++ 0x最终草案,没有办法请求线程终止。 这就是说,如果需要,我们需要实施一个自己动手的解决scheme。 另一方面,boost :: thread提供了一种以安全方式中断线程的机制。 在你看来,最好的解决scheme是什么? devise自己的合作“中断机制”还是本土化?
我正在研究一个正在破坏堆的multithreading C ++应用程序。 find这种腐败的常用工具似乎不适用。 源代码的旧版本(18个月)与最新发布的版本具有相同的行为,所以这已经存在了很长时间,并没有被注意到。 在缺点方面,不能使用源variables来确定何时引入错误 – 存储库中有很多代码更改。 崩溃行为的提示是在这个系统中生成吞吐量 – 数据的套接字传输被转化为内部表示。 我有一组testing数据,将定期导致应用程序exception(各种地方,各种原因 – 包括堆分配失败,因此:堆损坏)。 这种行为似乎与CPU功率或内存带宽有关; 每台机器越多,崩溃越容易。 禁用超线程核心或双核心核心会降低(但不会消除)腐败的速度。 这表明了与时间有关的问题。 现在这里是擦: 当它运行在一个轻量级的debugging环境(比如说Visual Studio 98 / AKA MSVC6 )时,堆损坏是相当容易重现的 – 十分钟或十五分钟之后,某些事情会发生可怕的exception,例如alloc; 当在一个复杂的debugging环境(Rational Purify, VS2008/MSVC9甚至Microsoft应用程序validation程序)下运行时,系统将变成内存速度限制,不会崩溃(内存限制:CPU没有达到50% ,磁盘指示灯不亮,程序运行的速度可以更快,消耗2G内存的1.3G内存)。 所以, 我可以在能够重现问题(但不能确定原因)或能够确定原因或无法重现的问题之间作出select。 我目前最好的猜测,接下来是: 获取一个疯狂的grunty框(以取代当前的dev盒:在E6550 Core2 Duo 2Gb内存); 这将使得有可能在强大的debugging环境下运行时导致崩溃导致错误行为; 要么 重写操作符new和delete以使用VirtualAlloc和VirtualProtect将内存尽快标记为只读。 运行在MSVC6下,让操作系统抓住正在释放内存的坏人。 是的,这是一个绝望的标志:谁将重写new和delete ? 我想知道这是否会像Purify等人一样慢。 并且,否:内置Purify仪器的运输不是一个选项。 一位同事刚刚走过去,问道:“堆栈溢出?我们现在正在堆栈溢出吗?!? 现在,问题是: 如何find堆腐败者? 更新:平衡new[]和delete[]似乎已经得到了解决这个问题很长的路要走。 应用程序现在大约两个小时才崩溃,而不是15分钟。 还没有。 还有什么build议? 堆腐败持续存在。 […]
我在修改线程内的视图时遇到问题。 我试图添加一个子视图,但需要大约6秒或更长时间来显示。 我终于搞定了,但我不知道如何。 所以我想知道为什么它的工作和以下方法有什么区别: //this worked -added the view instantly dispatch_async(dispatch_get_main_queue(), ^{ //some UI methods ej [view addSubview: otherView]; } //this took around 6 or more seconds to display [viewController performSelectorOnMainThread:@selector(methodThatAddsSubview:) withObject:otherView waitUntilDone:NO]; //Also didnt work: NSNotification methods – took also around 6 seconds to display //the observer was in the viewController I wanted to […]
我正试图通过实时期限来提高线程应用程序的性能。 它运行在Windows Mobile上,用C / C ++编写。 我怀疑线程切换的高频率可能会导致有形的开销,但是既不能certificate也不能反证。 大家都知道,缺乏证据不是相反的certificate:)。 因此我的问题是双重的: 如果存在,我可以在哪里find切换线程上下文成本的实际测量值? 不花时间编写testing应用程序,估计现有应用程序中线程切换开销的方法是什么? 有没有人知道一个方法来找出一个给定的线程上下文切换的数量(开/关)?
Java中的线程在技术上可能会自己死锁吗? 我在一次采访中被问到这个问题,回答说这是不可能的,但采访者告诉我说这是事实。 不幸的是我无法获得如何实现这个僵局的方法。 这让我想到了,我能想到的唯一情况就是在哪里有一个RMI服务器进程,其中包含一个调用自己的方法。 调用该方法的代码行放置在同步块中。 这甚至有可能或是面试官不正确? 我正在考虑的源代码是沿着这些线(其中testDeadlock在RMI服务器进程中运行) public boolean testDeadlock () throws RemoteException { synchronized (this) { //Call testDeadlock via RMI loopback } }
如果我有一个无限循环中的线程,有没有办法终止主程序结束时(例如,当我按ctrl+C )?
这两个陈述是否相同? Thread.sleep(0); Thread.yield();
在一个使用Monitor.PulseAll()进行线程同步的库中,我注意到从调用PulseAll(…)的时间到线程被唤醒的时间似乎都遵循着“阶梯”分布 – 大步骤。 清醒的线程几乎没有工作; 几乎立即回到监视器上等待。 例如,在12个监视器上有24个线程的盒子(2个Xeon5680 / Gulftown;每个处理器6个物理内核;禁用HT),Pulse和一个线程唤醒之间的延迟是这样的: 前12个线程(注意我们有12个内核)需要30到60微秒来响应。 然后我们开始变得非常大跳跃; 高原大约在700,1300,1900和2600微秒。 使用下面的代码,我能够独立于第三方库成功重新创build此行为。 这段代码所做的是启动大量的线程(改变numThreads参数),这些线程只是在监视器上等待,读取一个时间戳,logging到一个ConcurrentSet,然后立即返回到Waiting。 一旦第二个PulseAll()唤醒了所有的线程。 它执行了这20次,并将第10次迭代的延迟报告给控制台。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Collections.Concurrent; using System.Diagnostics; namespace PulseAllTest { class Program { static long LastTimestamp; static long Iteration; static object SyncObj = new object(); static Stopwatch s = new Stopwatch(); […]
为什么在Object类中声明wait()和notify()方法,而不是Thread类?
使用Condition接口/实现比传统的等待通知机制有什么优势? 在这里我引用Doug Lea写的评论: 将对象监视器方法(wait,notify和notifyAll)的条件因素排除在不同的对象之外,使每个对象具有多个等待集,并将它们与使用任意Lock实现相结合。 在Lock取代了同步方法和语句的使用的情况下,一个Condition取代了Object监视器方法的使用。 我看到这是一个更加面向对象的实现等待/通知机制的方式。 但是有没有比前者好的优势?