Questions tagged «multithreading»

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

3
Python字典中的线程安全
我有一堂课,有一本字典 class OrderBook: orders = {'Restaurant1': None, 'Restaurant2': None, 'Restaurant3': None, 'Restaurant4': None} @staticmethod def addOrder(restaurant_name, orders): OrderBook.orders[restaurant_name] = orders 我正在运行4个线程(每个餐厅一个线程)来调用方法OrderBook.addOrder。这是每个线程运行的函数: def addOrders(restaurant_name): #creates orders ... OrderBook.addOrder(restaurant_name, orders) 这样安全吗,还是在致电之前必须使用锁addOrder?

3
STAThread和多线程
从STAThread上的MSDN文章中: 指示应用程序的COM线程模型是单线程单元(STA)。 (供参考,这是整篇文章。) 单线程公寓...好吧,这让我头疼。另外,我在某处读到,除非您的应用程序使用COM互操作,否则此属性实际上什么都不做。那么它到底是做什么的,又如何影响多线程应用程序呢?Timer即使“为了安全”,多线程应用程序(包括使用s的任何人到异步方法调用,而不仅仅是线程池之类的东西)都应该使用MTAThread吗?STAThread和MTAThread实际做什么?
102 c#  .net  multithreading  sta 


4
创建线程-Task.Factory.StartNew与new Thread()
我只是在学习.Net 4中的新线程和并行库 在过去,我将像这样创建一个新线程(作为示例): DataInThread = new Thread(new ThreadStart(ThreadProcedure)); DataInThread.IsBackground = true; DataInThread.Start(); 现在我可以做: Task t = Task.Factory.StartNew(() => { ThreadProcedure(); }); 有什么区别? 谢谢


7
为什么Java ThreadLocal变量应该是静态的
我在这里阅读Threadlocal的JavaDoc https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ThreadLocal.html 它说:“ ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段(例如,用户ID或事务ID)。” 但是我的问题是,为什么他们选择使其静态化(通常)-使其具有“每个线程”状态,但字段是静态的则有些令人困惑?

6
WAIT和BLOCKED线程状态之间的区别
线程状态WAIT和线程状态BLOCKED有什么区别? 该Thread.State文档: 已阻止 该线程在等待监视器锁定时被阻止,处于此状态。 等待中 无限期等待另一个线程执行特定操作的线程处于此状态 没有向我解释差异。

5
Python中的“线程本地存储”是什么,为什么需要它?
特别是在Python中,变量如何在线程之间共享? 尽管我threading.Thread以前从未使用过,但从未真正理解或看到过如何共享变量的示例。它们是在主线程和子线程之间共享还是仅在子线程之间共享?我何时需要使用线程本地存储来避免这种共享? 我已经看到许多关于通过使用锁在线程之间同步访问共享数据的警告,但是我还没有看到一个很好的问题示例。 提前致谢!

2
如何分析Java线程转储?
我试图了解有关Java的更多信息,尤其是有关内存管理和线程的信息。因此,我最近发现对线程转储感兴趣。 以下是使用VisualVM(适用于Java的内置工具)从Web应用程序摘录的几行内容: "Finalizer" daemon prio=8 tid=0x02b3d000 nid=0x898 in Object.wait() [0x02d0f000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x27ef0288> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118) - locked <0x27ef0288> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159) Locked ownable synchronizers: - None "Reference Handler" daemon prio=10 tid=0x02b3b800 nid=0x494 in Object.wait() [0x02cbf000] java.lang.Thread.State: …

9
如何在排队之前让ThreadPoolExecutor将线程增加到最大数量?
我一直对默认行为ThreadPoolExecutor支持ExecutorService很多人使用的线程池感到沮丧。引用Javadocs: 如果运行的线程数量超过corePoolSize但少于maximumPoolSize,则仅在队列已满时才创建新线程。 这意味着,如果使用以下代码定义线程池,则它将永远不会启动第二个线程,因为该线程LinkedBlockingQueue是无界的。 ExecutorService threadPool = new ThreadPoolExecutor(1 /*core*/, 50 /*max*/, 60 /*timeout*/, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(/* unlimited queue */)); 仅当您有一个受限制的队列并且该队列已满时,才会启动高于核心号的任何线程。我怀疑大量的初级Java多线程程序员都没有意识到这种行为ThreadPoolExecutor。 现在,我有一个特定的用例,它不是最佳的。我正在寻找无需编写自己的TPE类的方法来解决该问题的方法。 我的要求是要对可能不可靠的第三方进行回调的Web服务。 我不想与Web请求同步进行回调,因此我想使用线程池。 我通常一分钟会收到几个,所以我不想拥有newFixedThreadPool(...)大量休眠的线程。 我每隔一段时间就会收到大量此类流量,我想将线程数扩展到某个最大值(比如说50)。 我需要尽最大的努力来完成所有回调,所以我希望将大于50的所有其他队列排队newCachedThreadPool()。 我如何解决此限制,ThreadPoolExecutor即在需要启动更多线程之前队列必须被限制为已满的地方?如何在排队任务之前启动更多线程? 编辑: @Flavio很好地说明了使用ThreadPoolExecutor.allowCoreThreadTimeOut(true)来使核心线程超时和退出。我考虑过,但是我仍然想要核心线程功能。我不希望池中的线程数尽可能降低到核心大小以下。

3
在新的Linux内核中,上下文切换要慢得多
我们希望将服务器上的操作系统从Ubuntu 10.04 LTS升级到Ubuntu 12.04 LTS。不幸的是,运行已变为可运行线程的等待时间似乎从2.6内核大大增加到3.2内核。实际上,我们难以置信的延迟数字。 让我更具体地介绍一下测试。我们有一个运行两个线程的程序。第一个线程获取当前时间(使用RDTSC进行滴答),然后每秒发送一次条件变量信号。第二个线程等待条件变量,并在发出信号时唤醒。然后,它获取当前时间(使用RDTSC进行滴答)。计算第二个线程中的时间和第一个线程中的时间之间的时差,并将其显示在控制台上。此后,第二个线程再次等待条件变量。大约经过一秒钟后,第一个线程将再次发出信号。 因此,简而言之,我们每秒通过条件变量等待时间测量获得线程到线程的通信。 在内核2.6.32中,此延迟约为2.8-3.5 us,这是合理的。在内核3.2.0中,此延迟已增加到40-100 us左右。我排除了两台主机之间的硬件差异。它们在相同的硬件上运行(双插槽X5687 {Westmere-EP}处理器以3.6 GHz运行,具有超线程,speedstep和所有C状态均已关闭)。测试应用程序更改了线程的亲和力,以便在同一套接字的独立物理内核上运行它们(即,第一个线程在Core 0上运行,第二个线程在Core 1上运行),因此在该线程上不会发生线程跳动核心或套接字之间的跳动/通信。 这两台主机之间的唯一区别是,一台主机运行的内核版本为2.6.32-28(快速上下文切换框),而另一台则运行最新的Ubuntu 12.04 LTS内核为3.2.0-23版本(慢上下文)。开关盒)。所有BIOS设置和硬件均相同。 内核中是否有任何变化可以解释线程调度运行需要多长时间的可笑速度减慢? 更新: 如果您想在您的主机和Linux构建上运行测试,我已将代码发布到pastebin供您阅读。编译: g++ -O3 -o test_latency test_latency.cpp -lpthread 运行(假设您至少有一个双核计算机): ./test_latency 0 1 # Thread 1 on Core 0 and Thread 2 on Core 1 更新2:在大量搜索内核参数,发布有关内核更改和个人研究的文章之后,我已经弄清了问题所在,并发布了解决方案作为对此问题的解答。

5
等待直到任务完成
如何使我的代码等待,直到DispatchQueue中的任务完成?是否需要任何CompletionHandler或其他东西? func myFunction() { var a: Int? DispatchQueue.main.async { var b: Int = 3 a = b } // wait until the task finishes, then print print(a) // - this will contain nil, of course, because it // will execute before the code above } 我正在使用Xcode 8.2并在Swift 3中编写。

4
DispatchQueue.main.async和DispatchQueue.main.sync之间的区别
我已经使用DispatchQueue.main.async了很长时间来执行与UI相关的操作。 Swift同时提供DispatchQueue.main.async和DispatchQueue.main.sync,并且两者都在主队列上执行。 谁能告诉我他们之间的区别?我什么时候应该使用每个? DispatchQueue.main.async { self.imageView.image = imageView self.lbltitle.text = "" } DispatchQueue.main.sync { self.imageView.image = imageView self.lbltitle.text = "" }

3
当前的SynchronizationContext不能用作TaskScheduler
我正在使用Tasks在ViewModel中运行长时间运行的服务器调用,并且Dispatcher使用整理了结果TaskScheduler.FromSyncronizationContext()。例如: var context = TaskScheduler.FromCurrentSynchronizationContext(); this.Message = "Loading..."; Task task = Task.Factory.StartNew(() => { ... }) .ContinueWith(x => this.Message = "Completed" , context); 当我执行应用程序时,这工作正常。但是,当我运行NUnit测试时,Resharper我收到的错误消息FromCurrentSynchronizationContext为: 当前的SynchronizationContext不能用作TaskScheduler。 我猜这是因为测试是在工作线程上运行的。如何确保测试在主线程上运行?欢迎其他任何建议。

5
C#计时器是否在单独的线程上运行?
System.Timers.Timer是否在与创建它的线程不同的线程上运行? 可以说我有一个带有计时器的类,该计时器每5秒触发一次。当计时器触发时,在经过的方法中,某些对象被修改。可以说,修改该对象需要很长时间,例如10秒。在这种情况下,是否可能会遇到线程冲突?

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.