Questions tagged «multithreading»

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

10
在Java关键部分中,应该同步哪些内容?
在Java中,在代码中声明关键部分的惯用方式如下: private void doSomething() { // thread-safe code synchronized(this) { // thread-unsafe code } // thread-safe code } 几乎所有块都在上同步 this,但是是否有特定原因呢?还有其他可能性吗?关于要同步的对象,是否有最佳实践?(例如Object?的私有实例)

7
终止多线程python程序
如何对Ctrl + C键事件做出多线程python程序响应? 编辑:代码是这样的: import threading current = 0 class MyThread(threading.Thread): def __init__(self, total): threading.Thread.__init__(self) self.total = total def stop(self): self._Thread__stop() def run(self): global current while current<self.total: lock = threading.Lock() lock.acquire() current+=1 lock.release() print current if __name__=='__main__': threads = [] thread_count = 10 total = 10000 for i in range(0, …

18
圆形无锁缓冲器
我正在设计一个系统,该系统连接到一个或多个数据提要流,并根据触发结果对数据进行一些分析。在典型的多线程生产者/消费者设置中,我将有多个生产者线程将数据放入队列中,并且有多个消费者线程读取数据,并且消费者只对最新数据点加n个点感兴趣。如果慢速使用者无法跟上生产者线程,则生产者线程将不得不阻塞,当然,当没有未处理的更新时,使用者线程也会阻塞。使用具有读取器/写入器锁定的典型并发队列会很好地工作,但是数据输入的速率可能很大,因此我想减少我的锁定开销,特别是为生产者减少写入器锁定。我认为我需要一个循环无锁缓冲区。 现在有两个问题: 循环无锁缓冲区是否是答案? 如果是这样,在我提出自己的建议之前,您知道任何适合我需要的公共实施方式吗? 始终欢迎实现循环无锁缓冲区的任何指针。 顺便说一句,在Linux上的C ++中执行此操作。 一些其他信息: 响应时间对我的系统至关重要。理想情况下,使用者线程希望尽快看到任何更新,因为额外的1毫秒延迟可能会使系统一文不值,甚至少很多。 我倾向于的设计思想是一个无半锁的循环缓冲区,在此缓冲区中,生产者线程将数据尽可能快地放入缓冲区中,我们将其称为缓冲区A的头,除非缓冲区已满,否则不要阻塞A与缓冲区Z的末尾相遇。使用者线程将分别持有两个指向循环缓冲区的指针P和P n,其中P是线程的本地缓冲区头,而P n是P之后的第n个项目。每个使用者线程都将推进其P一旦完成当前P的处理,P n和P n就会以最慢的P n前进到缓冲区指针Z的末尾。当P赶上A,这意味着不再有新的更新要处理时,使用者旋转并忙于等待A再次前进。如果使用者线程旋转时间过长,则可以使其进入睡眠状态并等待条件变量,但是我可以接受使用者占用CPU周期等待更新,因为这不会增加我的延迟(我将拥有更多的CPU内核)比线程)。想象一下,您有一个循环的轨道,而生产者在一群消费者的面前运行,关键是调整系统,以便生产者通常比消费者领先几步,而其中大多数操作可以使用无锁技术完成。我知道正确实现实现的细节并不容易...好吧,非常艰苦,这就是为什么我想在别人做些自己的事情之前先从别人的错误中学习。




12
如何在Form的Closing事件中停止BackgroundWorker?
我有一个生成BackgroundWorker的表单,该表单应该更新表单自己的文本框(在主线程上),因此进行Invoke((Action) (...));调用。 如果HandleClosingEvent我真bgWorker.CancelAsync()那么我得到ObjectDisposedException的Invoke(...)电话,可以理解。但是,如果我坐在那里HandleClosingEvent等待bgWorker完成,那么.Invoke(...)永远不会返回,这也是可以理解的。 有什么想法如何关闭该应用程序而不会出现异常或死锁吗? 以下是简单的Form1类的3种相关方法: public Form1() { InitializeComponent(); Closing += HandleClosingEvent; this.bgWorker.RunWorkerAsync(); } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { while (!this.bgWorker.CancellationPending) { Invoke((Action) (() => { this.textBox1.Text = Environment.TickCount.ToString(); })); } } private void HandleClosingEvent(object sender, CancelEventArgs e) { this.bgWorker.CancelAsync(); /////// while (this.bgWorker.CancellationPending) {} // deadlock }

4
Node.js的事件驱动有何不同?我们不能在ASP.Net的HttpAsyncHandler中做到这一点吗?
我对Web编程的经验不是很丰富,并且实际上还没有在Node.js中编写任何代码,只是对事件驱动的方法感到好奇。看起来确实不错。 本文介绍了当我们使用基于线程的方法来处理请求时可能发生的一些坏事情,而应该选择事件驱动的方法。在基于线程的情况下,收银员/线程会一直困扰我们,直到我们准备好食物/资源为止。在事件驱动下,收银员将我们发送到请求队列之外的某个地方,因此我们在等待食物时不会阻止其他请求。要基于阻塞线程进行扩展,您需要增加线程数量。对我来说,这似乎是不好用的借口,原因是未正确使用线程/线程池。 使用IHttpAsyncHandler无法正确处理吗?ASP.Net接收一个请求,使用ThreadPool并运行处理程序(BeginProcessRequest),然后在其中加载带有回调的文件/数据库。然后,该线程应该可以自由处理其他请求。一旦文件读取完成,ThreadPool将再次被调用并执行剩余的响应。对我来说没什么不同,那为什么不那么可扩展? 我确实知道基于线程的缺点之一是,使用线程需要更多的内存。但是只有有了这些,您才能享受多核的好处。我怀疑Node.js根本没有使用任何线程/内核。 因此,仅基于事件驱动和基于线程(不要带“因为它是Javascript和每个浏览器...”参数),有人可以指出我使用Node.js而不是使用它的实际好处是什么。现有技术? 这是一个很长的问题。谢谢 :)

24
多任务,多线程和多处理之间的区别?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 12天前关闭。 改善这个问题 多任务,多程序和多处理之间有什么区别 这是我的大学操作系统考试中经常出现的问题,我找不到很好的答案。我对多任务和多编程了解很多,但需要确认。

3
如何找到ManualResetEvent处于什么状态?
我正在使用的实例ManualResetEvent来控制对资源的线程访问,但是我遇到了问题。有谁知道我在调试过程中如何找出对象的状态? 也就是说,我想知道该ManualResetEvent线程当前是否正在阻止任何线程,甚至可能阻止多少线程以及正在阻止哪个线程。

5
并发JUnit测试
我有一个大型的JUnit测试套件,出于两个原因,我想在其中同时运行所有测试: 利用多个内核来更快地运行整个测试套件 希望检测到由于非线程安全的全局对象而导致的一些错误 我知道这将迫使我重构一些代码以使其具有线程安全性,但是我认为这是一件好事:-) 使JUnit同时运行所有测试的最佳方法是什么?

3
Python time.sleep()与event.wait()
我想在我的多线程Python应用程序中定期执行操作。我已经看到了两种不同的方法 exit = False def thread_func(): while not exit: action() time.sleep(DELAY) 要么 exit_flag = threading.Event() def thread_func(): while not exit_flag.wait(timeout=DELAY): action() 一种方法比另一种方法有优势吗?是使用更少的资源还是与其他线程和GIL更好地协作?哪一个使我的应用程序中的其余线程更具响应性? (假设有一些外部事件集exit或exit_flag,我愿意在关闭时等待完整的延迟)

2
TPL与异步/等待(线程处理)之间的区别
试图了解TPL&async/await与线程创建之间的区别。 我相信TPL(TaskFactory.StartNew)的工作方式ThreadPool.QueueUserWorkItem与之类似,因为它使线程池中的线程上的工作排队。当然,除非您使用TaskCreationOptions.LongRunning它创建一个新线程。 我认为async/await本质上将类似地工作: TPL: Factory.StartNew( () => DoSomeAsyncWork() ) .ContinueWith( (antecedent) => { DoSomeWorkAfter(); },TaskScheduler.FromCurrentSynchronizationContext()); Async/ Await: await DoSomeAsyncWork(); DoSomeWorkAfter(); 将是相同的。从我一直在阅读的内容来看,似乎async/ await“有时”创建了一个新线程。那么,何时创建新线程,何时不创建新线程?如果您正在处理IO完成端口,我可以看到它不必创建新线程,但否则我认为必须这样做。我想我对FromCurrentSynchronizationContext永远的理解也有些模糊。从本质上讲,我始终认为它是UI线程。


5
BackgroundWorker中未处理的异常
我的WinForms应用程序使用许多BackgroundWorker对象从数据库检索信息。我之所以使用BackgroundWorker,是因为它允许UI在长时间运行的数据库查询期间保持畅通无阻,并且为我简化了线程模型。 我在其中某些后台线程中偶尔遇到DatabaseException,并且在调试时目睹了在工作线程中至少有这些异常之一。我非常相信这些异常是超时,我认为它是不时会发生的合理事件。 我的问题是,在这些后台工作线程之一中发生未处理的异常时会发生什么。 我认为我无法在另一个线程中捕获异常,但是我可以期望执行我的WorkerCompleted方法吗?是否可以查询BackgroundWorker的任何属性或方法来处理异常?

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.