我经常发现这些术语在并发编程的环境中使用。 他们是相同的还是不同的?
假设你的Java程序占用了100%的CPU。 它有50个线程。 你需要find哪个线程有罪。 我还没有find可以帮助的工具。 目前我使用以下非常耗时的程序: 运行jstack <pid> ,其中pid是Java进程的进程标识。 find它的简单方法是运行包含在JDK- jps中的另一个实用程序。 将jstack的输出redirect到一个文件是最好的。 search“可运行”线程。 跳过那些在套接字上等待(由于某些原因,它们仍然标记为可运行)。 重复步骤1和2几次,看看你是否可以find一个模式。 或者,您可以在Eclipse中附加Java进程,并尝试一个接一个地挂起线程,直到您碰到CPU。 在单CPU机器上,您可能需要首先减lessJava进程的优先级,以便能够移动。 即使如此,由于超时,Eclipse常常无法附加到正在运行的进程。 我会期望Sun的visualvm工具来做到这一点。 有人知道更好的方法吗?
从我读过的任务中,下面的代码应该取消当前执行的任务而不会抛出exception。 我的印象是,取消任务的全部任务就是礼貌地“要求”任务停止而不中止线程。 以下程序的输出是: 倾销例外 [OperationCanceledException] 取消并返回上次计算的素数。 我试图在取消时避免任何exception。 我怎样才能做到这一点? void Main() { var cancellationToken = new CancellationTokenSource(); var task = new Task<int>(() => { return CalculatePrime(cancellationToken.Token, 10000); }, cancellationToken.Token); try { task.Start(); Thread.Sleep(100); cancellationToken.Cancel(); task.Wait(cancellationToken.Token); } catch (Exception e) { Console.WriteLine("Dumping exception"); e.Dump(); } } int CalculatePrime(CancellationToken cancelToken, object digits) { int factor; int lastPrime = […]
在之前的一个问题中 ,我犯了一些失礼。 你看,我一直在读线索,并有一个印象,那就是猕猴桃果冻以来最好吃的东西。 想象一下当我读到这样的东西时,我的困惑: 恐惧是一件非常糟糕的事情。 或者,至less,线程的显式pipe理是一件坏事 和 通过线程更新UI通常表示您正在滥用线程。 由于我每次都会让一个小狗感到困惑,因此我认为这个机会让你的业力重新回到黑色中。 我应该如何使用线程?
我正在Python中开发一个固有的multithreading模块,我想知道它在哪里花费时间。 cProfile似乎只是configuration主线程。 是否有任何方法来分析计算中涉及的所有线程?
我认为线程安全,特别是,它意味着它必须满足multithreading访问相同的共享数据的需要。 但是,这个定义似乎还不够。 任何人都可以列出的事情要做或照顾使应用程序线程安全 。 如果可能的话,就C / C ++语言给出一个答案。
如果我有一个C ++ 11程序运行两个线程,其中一个抛出一个未处理的exception,会发生什么? 整个程序会不会是一场火热的死亡? 请问抛出exception的线程是否会死亡(如果是的话,我能否在这种情况下获得exception)? 还有其他的东西吗?
在单个核心CPU上,每个进程在OS中运行,CPU从一个进程跳转到另一个进程,以充分利用自身。 一个进程可以有很multithreading,在这种情况下,当CPU在相应的进程上运行时,CPU通过这些线程运行。 现在,在多核CPU上: 核心是否在每个进程中一起运行,或者核心可以在特定的时间点在不同的进程中分别运行? 例如,你有程序A运行两个线程。 双核CPU能运行这个程序的两个线程吗? 我认为如果我们使用像OpenMP这样的答案应该是。 但是,当核心运行在OpenMPembedded式过程中时,其中一个内核是否可以简单地切换到其他进程? 对于为单核创build的程序,当以100%运行时,为什么每个核心的CPU利用率分布? (例如80%和20%的双核CPU,在这种情况下,所有内核的利用率总是达到100%)。内核是否试图通过以某种方式运行每个进程的每个线程来相互帮助?
我对线程的概念还是比较陌生的,试着更多地了解它。 最近,我遇到了一篇关于杰里米·曼森(Jarremy Manson)的“ 什么是挥发性手段(What Volatile Means in Java)”的博文,他写道: 当一个线程写入一个volatilevariables,另一个线程看到写入时,第一个线程告诉第二个线程关于所有内存的内容,直到写入该volatilevariables。 在线程1写入[volatile] ready之前,线程1看到的所有内存内容必须对线程2可见,然后它读取ready的值true 。 [强调自己加] 现在,这是否意味着在写入volatilevariables时线程1的内存中保存的所有variables(volatile或不)在线程2读取该volatilevariables之后将变为可见? 如果是这样, 是否有可能从官方的Java文档/ Oracle来源拼凑这个声明? 从哪个Java版本开始这个工作? 特别是,如果所有线程共享以下类variables: private String s = "running"; private volatile boolean b = false; 线程1首先执行以下操作: s = "done"; b = true; 线程2然后执行(线程1写入易失性字段后): boolean flag = b; //read from volatile System.out.println(s); 这将保证打印“完成”? 如果不是将b声明为volatile而是将写入和读取放入synchronized块,会发生什么? 此外,在题为“ 线程之间共享静态variables? ”的讨论中,@TREE 写道 : 不要使用volatile来保护多个共享状态。 为什么? […]
我知道recursion互斥锁允许互斥锁被locking不止一次而没有发生死锁,应该解锁相同的次数。 但是在什么情况下你需要使用recursion互斥? 我正在寻找devise/代码级别的情况。