Questions tagged «multithreading»

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

7
.NET中是否存在僵尸……?
我正在与队友讨论锁定.NET的问题。他是一个非常聪明的人,在低级和高级编程方面都有广泛的背景,但是他在低级编程方面的经验远远超过了我。无论如何,他认为应该在可能承受重负载的关键系统上避免.NET锁定,以免“僵尸线程”崩溃的可能性很小。我通常使用锁定,但我不知道“僵尸线程”是什么,所以我问。我从他的解释中得到的印象是,僵尸线程是已终止但仍保留了某些资源的线程。他举了一个关于僵尸线程如何破坏系统的示例,该示例是线程在锁定某个对象后开始执行某些过程,然后在可以释放锁之前终止。这种情况有可能使系统崩溃,因为最终尝试执行该方法将导致线程全部等待访问永远不会返回的对象,因为使用锁定对象的线程已死。 我想我明白了要点,但是如果我不在基地,请告诉我。这个概念对我来说很有意义。我并不完全相信这是.NET中可能发生的真实情况。我以前从未听说过“僵尸”,但我确实认识到在较低级别进行过深入研究的程序员往往对计算基础(例如线程)有更深的了解。我确实确实看到了锁定的价值,而且我看到许多世界一流的程序员都在利用锁定。我也没有能力自己评估这一点,因为我知道该lock(obj)语句实际上仅是以下方面的语法糖: bool lockWasTaken = false; var temp = obj; try { Monitor.Enter(temp, ref lockWasTaken); { body } } finally { if (lockWasTaken) Monitor.Exit(temp); } 并且因为Monitor.Enter和Monitor.Exit被标记extern。可以想象.NET进行了某种处理,以保护线程免于暴露于可能造成这种影响的系统组件,但这纯粹是推测性的,并且可能基于我从未听说过“僵尸线程”的事实。之前。因此,我希望可以在这里获得一些反馈: 是否有比我在此解释的“僵尸线程”更清晰的定义? 僵尸线程可以出现在.NET上吗?(为什么/为什么不呢?) 如果适用,如何在.NET中强制创建僵尸线程? 如果适用,如何在不冒险使用.NET中僵尸线程的情况下利用锁定? 更新资料 两年多前,我问了这个问题。今天,这件事发生了:


9
什么是std :: promise?
我相当熟悉C ++ 11分的std::thread,std::async和std::future部件(例如见这个答案),这是直接的。 但是,我不太了解std::promise它的用途,作用以及在什么情况下最好使用它。标准文档本身不包含除类概述之外的大量信息,而且::: thread也不包含。 有人可以举一个简短,简洁的例子来说明这种情况的std::promise需要,它是最惯用的解决方案?

13
处理程序与AsyncTask与线程[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 10个月前关闭。 我得到了稍微感到困惑之间的差异Handlers,AsyncTask并Threads在Android中。我已经在StackOverflow上阅读了很多博客和问题。 Handler是提供您与UI进行通信的后台线程。例如,更新进度条应通过进行Handler。使用处理程序具有的优势MessagingQueues,因此,如果您要计划消息或更新多个UI元素或具有重复任务。 AsyncTask相似,实际上,它们使用Handler,但没有在UI线程中运行,因此对于获取数据(例如获取Web服务)非常有用。稍后,您可以与UI进行交互。 Thread但是不能与UI交互,提供更多的“基本”线程,您会错过的所有抽象AsyncTask。 但是,我想在服务中运行套接字连接。应该在处理程序,线程还是什至是线程中运行它AsyncTask吗?完全不需要UI交互。我使用的性能是否有所不同? 同时,文档已得到重大改进。

22
避免在Java中同步(this)?
每当关于Java同步的问题浮出水面时,有些人就会很想指出synchronized(this)应该避免的事情。他们声称,取而代之的是,最好是锁定私有引用。 给出的一些原因是: 一些邪恶的代码可能会窃取您的锁(非常流行,也有一个“偶然的”变体) 同一类中的所有同步方法都使用完全相同的锁,这会降低吞吐量 您(不必要地)暴露了太多信息 包括我在内的其他人则认为,这synchronized(this)是一个惯用语言(在Java库中也是如此),是安全且易于理解的。应当避免这种情况,因为您有一个错误,而且对多线程程序中正在发生的事情一无所知。换句话说:如果适用,请使用它。 我对看到一些真实的示例(没有foobar的东西)感兴趣,在这种情况下,避免锁定this也更可取synchronized(this)。 因此:您是否应该始终避免synchronized(this)使用私有引用锁定并将其替换? 一些进一步的信息(根据给出的答案进行更新): 我们正在谈论实例同步 的隐式(synchronized方法)和显式形式synchronized(this)都被考虑 如果您引用Bloch或有关该主题的其他权威,请不要遗漏您不喜欢的部分(例如,Effective Java,Thread Safety上的项目:通常是实例本身的锁,但也有例外)。 如果您需要锁定而不是synchronized(this)提供粒度,synchronized(this)则不适用,所以这不是问题

25
如何使用ExecutorService等待所有线程完成?
我需要一次执行一些任务4,如下所示: ExecutorService taskExecutor = Executors.newFixedThreadPool(4); while(...) { taskExecutor.execute(new MyTask()); } //...wait for completion somehow 完成所有步骤后如何通知我?现在,我想不出什么比设置一些全局任务计数器并在每个任务结束时减少它,然后无限循环监视此计数器为0更好的了。或获取期货的列表,并在无限循环中对所有期货进行isDone监视。什么是不涉及无限循环的更好的解决方案? 谢谢。

16
该应用程序可能在其主线程上做过多的工作
我是Android SDK / API环境的新手。这是我第一次尝试绘制图表。我尝试使用3个不同的免费库运行仿真器的各种示例代码,但布局屏幕上没有任何显示。logcat重复以下消息: W / Trace(1378):nativeGetEnabledTags中的异常值:0 I / Choreographer(1378):跳过了55帧!该应用程序可能在其主线程上做太多工作。 当我运行与许可库的评估副本有关的示例代码时,问题仍然存在,并且图表起作用了。

8
任务和线程有什么区别?
在C#4.0中,我们Task在System.Threading.Tasks命名空间中。Thread和之间的真正区别是什么Task。为了我自己的学习,我做了一些示例程序(来自MSDN的帮助) Parallel.Invoke Parallel.For Parallel.ForEach 但是有很多疑问,因为这个想法不太清楚。 我最初在Stackoverflow中搜索了类似类型的问题,但可能与此问题标题有关,我无法获得相同的问题。如果有人知道先前在此处发布的相同类型的问题,请提供链接的参考。

26
Java:再次遍历notify()与notifyAll()
Наэтотвопросестьответына 堆栈溢出нарусском:Вчемотличие通知,notifyAll的? 如果“之间的区别一个谷歌notify()和notifyAll()”,那么很多的解释,会弹出(除了留下javadoc的段落)。这一切都归结于被唤醒等待的线程数:一个是notify()和所有notifyAll()。 但是(如果我确实正确理解了这两种方法之间的区别),总是只选择一个线程来进行进一步的监视器获取;在第一种情况下,由VM选择,在第二种情况下,由系统线程调度程序选择。程序员不知道它们的确切选择过程(在一般情况下)。 然后notify()和notifyAll()的有用区别是什么?我想念什么吗?

14
在Linux中对pthread_create的未定义引用
我从https://computing.llnl.gov/tutorials/pthreads/在网络上获取了以下演示 #include <pthread.h> #include <stdio.h> #define NUM_THREADS 5 void *PrintHello(void *threadid) { long tid; tid = (long)threadid; printf("Hello World! It's me, thread #%ld!\n", tid); pthread_exit(NULL); } int main (int argc, char *argv[]) { pthread_t threads[NUM_THREADS]; int rc; long t; for(t=0; t<NUM_THREADS; t++){ printf("In main: creating thread %ld\n", t); rc = …




11
如何按定义的时间间隔在Android中运行可运行线程?
我开发了一个应用程序,用于在Android模拟器屏幕中按定义的间隔显示一些文本。我正在Handler上课。这是我的代码片段: handler = new Handler(); Runnable r = new Runnable() { public void run() { tv.append("Hello World"); } }; handler.postDelayed(r, 1000); 当我运行此应用程序时,该文本仅显示一次。为什么?


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.