Tag: multithreading

从技术上讲,为什么Erlang中的进程比OS线程更有效率?

Erlang的特点 来自Erlang编程 (2009): Erlang的并发性是快速和可扩展的。 其进程是轻量级的,因为Erlang虚拟机不会为每个创build的进程创build一个OS线程。 它们是在虚拟机中创build,调度和处理的,与底层操作系统无关。 因此,进程创build时间是微秒级的,并且与现有进程的数量无关。 将它与Java和C#进行比较,在每个进程中创build一个底层操作系统线程:您将得到一些非常有竞争力的比较结果,Erlang的性能大大超过了这两种语言。 来自Erlang的并发导向编程(pdf) (幻灯片) (2003): 我们观察到创build一个Erlang过程所花费的时间是恒定的1μs到2500个过程; 此后,对于多达30000个过程,其增加到约3μs。 Java和C#的性能显示在图的顶部。 对于less量的stream程来说,创build一个stream程大约需要300μs。 创build两千多个进程是不可能的。 我们看到,对于多达30,000个进程,在两个Erlang进程之间发送消息的时间大约是0.8μs。 对于C#,每个消息大约需要50μs,直到最大进程数(大约1800个进程)。 Java甚至更糟糕,对于高达100个进程,每个消息花费大约50μs,而当有大约1000个Java进程时,每个消息快速增加到10ms。 我的想法 我没有完全理解为什么Erlang进程在产生新进程方面更有效率,并且每个进程的内存占用更小。 操作系统和Erlang虚拟机都必须执行调度,上下文切换以及跟踪寄存器中的值等。 简单地说,为什么OS线程不像Erlang中的进程一样实现呢? 他们需要更多的支持吗? 为什么他们需要更大的内存空间? 为什么他们的产卵和交stream比较慢? 从技术上讲,为什么Erlang中的进程比OS线程在产卵和通信方面更有效率? 为什么操作系统中的线程不能以同样有效的方式实现和pipe理? 为什么操作系统线程有更大的内存占用,再加上较慢的产卵和通信? 更多的阅读 Erlang VM内部重点关注SMP (2008) Java和Erlang中的并发(pdf) (2004) Java和进程中的线程性能测量(Erlang ,1998)

asynchronous与multithreading – 有没有区别?

asynchronous调用是否总是创build一个新的线程? 两者有什么区别? asynchronous调用是否总是创build或使用新的线程? 维基百科说 : 在计算机编程中,asynchronous事件是独立于主程序stream程发生的事件。 asynchronous操作是在非阻塞scheme中执行的操作,允许主程序stream继续处理。 我知道asynchronous调用可以在单线程上完成吗? 这怎么可能?

从多个线程使用stdlib的rand()

我有几个线程都运行相同的function。 在每一个这些他们产生一个不同的随机数数倍。 我们试图通过把srand(time(0))放在srand(time(0))的开头来做到这一点,但似乎它们都得到了相同的数字。 我们是否需要每个程序只调用一次srand(time(0)) ,即在main (例如)的开始处,每次调用几次函数的开始处,还是别的东西?

一次只运行一组任务

比方说,我有100个任务需要10秒钟的时间。 现在我只想一次只运行10个,就像10个任务中的1个完成另一个任务,直到所有任务完成。 现在我总是使用ThreadPool.QueueUserWorkItem()来完成这个任务,但是我读过这样做是不好的做法,而应该使用Tasks来代替。 我的问题是,我没有find一个很好的例子,所以你可以让我开始如何实现这个目标与任务?

在UI线程上同步取消挂起的任务

有时,一旦我用CancellationTokenSource.Cancel请求取消挂起的任务,我需要确保任务已经正确到达取消状态 ,然后才能继续。 我经常遇到这种情况,当应用程序正在终止,我想优雅地取消所有挂起的任务。 但是,当新的后台进程只有在当前未完成的进程已经被完全取消或自然到达时才能启动,这也可以是UI工作stream规范的要求。 如果有人分享他/她的处理这种情况的方法,我将不胜感激。 我正在谈论以下模式: _cancellationTokenSource.Cancel(); _task.Wait(); 就像这样,在UI线程上使用它时很容易导致死锁。 但是,并不总是可以使用asynchronous等待(即await task ;例如,这是可能的情况之一)。 与此同时,简单地请求取消并且继续而不实际观察其状态是一种代码味道。 作为一个简单的例子来说明这个问题,我可能想确保在FormClosing事件处理程序中完全取消了以下的DoWorkAsync任务。 如果我不等待MainForm_FormClosing的_task ,我甚至可能不会看到当前工作项目的"Finished work item N"跟踪,因为应用程序终止于待处理子任务的中间(在池线程)。 如果我真的等待,结果会陷入僵局: public partial class MainForm : Form { CancellationTokenSource _cts; Task _task; // Form Load event void MainForm_Load(object sender, EventArgs e) { _cts = new CancellationTokenSource(); _task = DoWorkAsync(_cts.Token); } // Form Closing event void MainForm_FormClosing(object […]

Thread.Sleep(TimeSpan)有多准确?

我遇到了一个间歇性失败的unit testing,因为时间已经不是我所期望的了。 这个testing是什么样子就是一个例子: Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); TimeSpan oneSecond = new TimeSpan(0, 0, 1); for(int i=0; i<3; i++) { Thread.Sleep(oneSecond); } stopwatch.Stop(); Assert.GreaterOrEqual(stopwatch.ElapsedMilliseconds, 2999); 大多数情况下,这个过程至less失败了一次失败,因为: 预计:大于或等于2999但是:2998 我不明白怎么可能less于3秒。 Thread.Sleep是否存在准确性问题,或者是我不知道的秒表? 就像下面一些问题的更新一样。 被unit testing的场景是一个类允许一个人调用一个方法来执行一些操作,如果它失败了,等一下再调用这个方法。 上面显示的testing只是近似发生的事情。 说我想调用一个方法DoSomething()…但是,如果DoSomething()引发exception,我希望能够重试调用它最多3次,但每次尝试之间等待1秒。 在这种情况下,unit testing的目的是validation当我们要求3次重试,每次重试之间等待1秒钟,总时间大于3秒。

什么是线程退出代码?

在debugging时,输出窗口中的线程退出代码究竟是什么? 它给了我什么信息? 这是不是有用的或只是一个内部的东西,不应该打扰我? The thread 0x552c has exited with code 259 (0x103). The thread 0x4440 has exited with code 0 (0x0). 是否可能有某种可能的退出代码列表及其意义?

如何在nodejs中创build线程

有什么办法可以创build线程一次运行多个方法。 如果任何方法在所有其他线程之间失败应该被杀死。 提前致谢

API Level 11之前的AsyncTask.executeOnExecutor()

我们在Android中执行AsyncTask的正常方法是,从Android API: private class DoIntenseTask extends AsyncTask<Object, Object, Void> { protected Void doInBackground(Object… params) { for (Object param : params) { Object rtnObj = doIntenseJob(param); publishProgress(rtnObj); } return null; } protected void onProgressUpdate(Object… progress) { for (Object rtnObj : progress) { updateActivityUI(rtnObj); } } } 我的激烈任务是松散耦合的,执行顺序并不重要,通过这样做,一个单独的线程被分配来运行一系列激烈的任务。 我个人认为这是一种半途而废的解决scheme。 是的,紧张的工作不再是在UI线程中运行,而是仍然需要逐一执行(在许多情况下,我们正面临着一份紧张的工作列表,我认为这也是AsyncTask中的方法是多参数化的原因)。 Google应该使API更加可重用,以解决不同types的场景。 我真正想要的是在线程池(例如poolSize = 5)中并行运行一些doIntenseJob()。 看起来像谷歌提供一个由AsyncTask.executeOnExecutor()的解决scheme,但不幸的是只有API级别11后才可用。我正在开发移动应用程序,并想知道是否有一种解决方法,我可以在API级别11下实现相同的行为。 提前致谢 ÿ

从线程获取线程ID

在C#中,当debugging线程时,你可以看到每个线程的ID。 我无法find一种方式来获得相同的线程,以编程方式。 我什至不能得到当前线程的ID(在Thread.currentThread属性中)。 所以,我想知道Visual Studio如何获得线程的ID,并有一种方法来获得与ID 2345线程的句柄,例如?