Questions tagged «multithreading»

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

4
.NET中辅助线程和I / O线程的简单描述
在.NET中很难找到工作线程和I / O线程的详细而简单的描述 对于该主题,我很清楚(但在技术上可能不准确): 辅助线程是应使用CPU进行工作的线程。 I / O线程(也称为“完成端口线程”)应使用设备驱动程序进行工作,并且实质上“不执行任何操作”,仅监视非CPU操作的完成情况。 不清楚的是: 尽管ThreadPool.GetAvailableThreads方法返回两种类型的可用线程数,但似乎没有公共API可以为I / O线程安排工作。您只能在.NET中手动创建辅助线程? 似乎单个I / O线程可以监视多个I / O操作。是真的吗 如果是这样,为什么默认情况下ThreadPool有这么多可用的I / O线程? 在某些文本中,我读到了由I / O线程执行I / O操作完成后触发的回调。是真的吗 考虑到此回调是CPU操作,这不是工作线程的工作吗? 更具体地说-ASP.NET异步页面是否使用I / O线程?将I / O工作切换到单独的线程而不是增加工作线程的最大数量时,性能上的好处到底是什么?是因为单个I / O线程会监视多个操作吗?还是Windows在使用I / O线程时进行更有效的上下文切换?

3
多线程程序停留在优化模式下,但在-O0下正常运行
我编写了一个简单的多线程程序,如下所示: static bool finished = false; int func() { size_t i = 0; while (!finished) ++i; return i; } int main() { auto result=std::async(std::launch::async, func); std::this_thread::sleep_for(std::chrono::seconds(1)); finished=true; std::cout<<"result ="<<result.get(); std::cout<<"\nmain thread id="<<std::this_thread::get_id()<<std::endl; } 它通常表现在调试模式下在Visual Studio中或-O0在GC c和后打印出的结果1秒钟。但是它卡住了,在“ 释放”模式或中不打印任何内容-O1 -O2 -O3。

3
Scala中的带有期货的异步IO
假设我要从一些URL下载一个(可能很大)图像列表。我正在使用Scala,所以我要做的是: import scala.actors.Futures._ // Retrieve URLs from somewhere val urls: List[String] = ... // Download image (blocking operation) val fimages: List[Future[...]] = urls.map (url => future { download url }) // Do something (display) when complete fimages.foreach (_.foreach (display _)) 我对Scala有点陌生,所以对我来说,这仍然有点像魔术: 这是正确的方法吗?如果不是,还有其他选择吗? 如果我要下载100张图像,这会一次创建100个线程,还是会使用线程池? 最后一条指令(display _)是否会在主线程上执行,否则,如何确定? 谢谢你的建议!




6
SyncRoot模式的用途是什么?
我正在阅读一本描述SyncRoot模式的书。表明 void doThis() { lock(this){ ... } } void doThat() { lock(this){ ... } } 并与SyncRoot模式进行比较: object syncRoot = new object(); void doThis() { lock(syncRoot ){ ... } } void doThat() { lock(syncRoot){ ... } } 但是,我不太了解这里的区别。在这两种情况下,似乎两种方法一次只能由一个线程访问。 这本书描述了……因为实例的对象也可以用于外部的同步访问,并且您无法控制类本身的形式,因此可以使用SyncRoot模式。“实例的对象”? 谁能告诉我以上两种方法之间的区别?

3
c11中的多线程支持
新的C11标准提供了对多线程的支持。 我的问题有点多样化,但肯定可以回答。 我看过C11 n1570草案。 它说: 支持多个执行线程,包括改进的内存排序模型,原子对象和线程本地存储(<stdatomic.h>和<threads.h>) 什么是改进的内存排序模型?与c99标准相比有何​​变化? 除了有人引用标准之外,如果有人深入研究它们并尝试解释所涉及的语义,我将不胜感激。 据我了解,C11提供以下支持: 线程创建和管理 互斥体 条件变量 线程专用存储和 原子物体 我希望我没有错过任何事情吗? 由于现在标准库本身提供了(将提供)多线程所需的所有功能,因此将来将不需要POSIX和此类库(用于多线程支持)吗? 最后,哪些编译器为上述功能提供支持?是否有关于何时支持时间表的参考? 我记得对于C ++ 11,有一个指向编译器支持和功能的链接,也许是这样的?
68 c  multithreading  c11 

4
为什么Java 5+中的volatile不能确保另一个线程的可见性?
根据: http://www.ibm.com/developerworks/library/j-jtp03304/ 在新的内存模型下,当线程A写入易失性变量V,而线程B从V读取时,现在保证了在写入V时A可见的任何变量值对B可见。 互联网上的许多地方都指出,以下代码永远不应显示“错误”: public class Test { volatile static private int a; static private int b; public static void main(String [] args) throws Exception { for (int i = 0; i < 100; i++) { new Thread() { @Override public void run() { int tt = b; // makes …

3
您如何定义要立即执行的goroutine池?
TL; DR:请转到最后一部分,告诉我如何解决此问题。 我今天早上开始使用来自Python的Go语言。我想用不同的命令行参数多次调用Go的封闭源可执行文件,并发一点。我得到的代码工作得很好,但是我想得到您的意见,以便进行改进。由于我处于早期学习阶段,因此我还将解释我的工作流程。 为了简单起见,在此假定此“外部封闭源程序”是zenityLinux命令行工具,可以从命令行显示图形消息框。 从Go调用可执行文件 因此,在Go中,我会这样: package main import "os/exec" func main() { cmd := exec.Command("zenity", "--info", "--text='Hello World'") cmd.Run() } 这应该工作正确。请注意,.Run()是一个功能相当于.Start()其次.Wait()。很好,但是如果我只想执行一次该程序,那么整个编程工作将不值得。因此,让我们做多次。 多次调用可执行文件 现在,我已经开始工作了,我想使用自定义命令行参数多次调用程序(这里只是i为了简单起见)。 package main import ( "os/exec" "strconv" ) func main() { NumEl := 8 // Number of times the external program is called for i:=0; i<NumEl; i++ …



4
调用fork时是否复制线程?
如果我有一个运行线程的程序并fork()在基于UNIX的系统上调用,是否复制了线程?我知道当前进程的虚拟内存将1:1复制到新进程。我知道线程在进程的虚拟内存中有自己的堆栈。因此,至少也应该复制线程堆栈。但是,我不知道线程中是否还有其他不驻留在虚拟内存中并且因此不会被复制的线程。如果没有,这两个进程是共享线程还是它们是独立副本?

7
如何在Java 8中创建阻止后台加载程序?
题 如何在Java 8中创建合适的后台加载程序?条件: 数据应在后台加载 加载后应显示数据 加载数据时,不应接受其他任何请求 如果在加载数据时有请求,则应在某个超时(例如5秒)后安排另一次加载 目的是例如使重载请求被接受,但数据库不被请求所淹没。 MCVE 这是MCVE。它由一个后台任务组成,该任务通过简单地调用Thread.sleep 2秒钟来模拟加载。每秒安排一次任务,这自然会导致后台加载任务重叠,应避免。 public class LoadInBackgroundExample { /** * A simple background task which should perform the data loading operation. In this minimal example it simply invokes Thread.sleep */ public static class BackgroundTask implements Runnable { private int id; public BackgroundTask(int id) …

1
产生线程是否自己提供内存顺序保证?
我想大致这样做: 初始线程: 向全局变量写入一些值(它们将不再被写入) 这可能是中等大小的数据(数组,字符串等)。无法简单地制造std::atomic<>。 产生其他线程 其他线程: 读取全局状态 做工作等 现在,我知道可以将参数传递给std::thread,但是我试图通过此示例理解C ++的内存保证。 另外,我非常有信心,在任何实际的实现中,创建线程都会造成内存障碍,从而确保线程可以“看到”父线程在此之前编写的所有内容。 但是我的问题是:这是否由标准保证? 另外:我想我可以添加一些虚拟对象std::atomic<int>,然后在启动其他线程之前写入该虚拟对象,然后在其他线程上,在启动时读取一次。我相信所有发生的事情都会确保之前编写的全局状态正确可见。 但是我的问题是,技术上是否需要类似的东西,或者线程创建是否足够?

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.