Questions tagged «multithreading»

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


4
如何使用WPF背景工
在我的应用程序中,我需要执行一系列初始化步骤,这些步骤需要7到8秒才能完成,在此期间我的UI变得无响应。为了解决这个问题,我在一个单独的线程中执行初始化: public void Initialization() { Thread initThread = new Thread(new ThreadStart(InitializationThread)); initThread.Start(); } public void InitializationThread() { outputMessage("Initializing..."); //DO INITIALIZATION outputMessage("Initialization Complete"); } 我已经阅读了几篇有关BackgroundWorker以及如何使我的应用程序保持响应的文章,而不必编写线程来执行冗长的任务,但是尝试实现它并没有获得成功,有人可以告诉我我会怎么做这个用BackgroundWorker?

10
有没有一种方法可以为整个应用程序设置区域性?所有当前线程和新线程?
有没有一种方法可以为整个应用程序设置区域性?所有当前线程和新线程? 我们将文化名称存储在数据库中,当我们的应用程序启动时, CultureInfo ci = new CultureInfo(theCultureString); Thread.CurrentThread.CurrentCulture = ci; Thread.CurrentThread.CurrentUICulture = ci; 但是,当然,当我们想在新线程中执行某些操作时,这会“丢失”。是否有设置,的一种方式CurrentCulture,并CurrentUICulture为整个应用程序?这样,新线程也可以得到这种文化?还是每当创建一个我可以连接的新线程时就会触发某个事件?

1
Mutex示例/教程?[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使它成为Stack Overflow 的主题。 4个月前关闭。 改善这个问题 我是多线程的新手,并试图了解互斥锁的工作原理。做了很多谷歌搜索,我发现了一个不错的教程,但是它仍然对它的工作方式产生了一些疑问,因为我创建了自己的程序,其中锁不起作用。 互斥锁的一种绝对不直观的语法pthread_mutex_lock( &mutex1 );是,当我真正想要锁定的是其他变量时,它看起来像互斥锁已被锁定。这种语法是否意味着锁定互斥锁会锁定代码区域,直到互斥锁解锁为止?那么线程如何知道该区域已锁定?[ 更新:线程知道该区域已被 Memory Fencing 锁定 ]。难道这种现象不应该称为临界区吗?[ 更新:关键部分对象仅在Windows中可用,其中这些对象比互斥对象快,并且仅对实现该对象的线程可见。否则,关键部分仅指由互斥锁保护的代码区域 ] 简而言之,能否请您提供最简单的互斥体示例程序以及有关其工作原理的最简单的解释?我确信这将对其他许多新手有所帮助。

8
如何在Python中找到线程ID
我有一个多线程Python程序和一个实用程序函数, writeLog(message),该写出时间戳记和消息。不幸的是,结果日志文件没有给出哪个线程正在生成哪个消息的指示。 我希望writeLog()能够在消息中添加一些内容,以标识哪个线程正在调用它。显然,我可以使线程将这些信息传递进来,但这将需要更多工作。是否有一些os.getpid()我可以使用的等效线程?

8
errno是线程安全的吗?
在中errno.h,此变量被声明为extern int errno;是我的问题,errno在某些调用之后检查值还是在多线程代码中使用perror()是安全的。这是线程安全变量吗?如果没有,那还有什么选择呢? 我在x86体系结构上将Linux与gcc一起使用。
174 c  linux  multithreading  gcc 

7
调用线程必须是STA,因为许多UI组件都需要STA
我正在使用http://www.codeproject.com/KB/IP/Facebook_API.aspx 我试图调用使用WPF创建的XAML。但这给了我一个错误: 调用线程必须是STA,因为许多UI组件都需要STA。 我不知道该怎么办。我正在尝试这样做: FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); 但这给了我这个错误。 我添加了一个背景工作者: static BackgroundWorker bw = new BackgroundWorker(); static void Main(string[] args) { bw.DoWork += bw_DoWork; bw.RunWorkerAsync("Message to worker"); Console.ReadLine(); } static void bw_DoWork(object sender, DoWorkEventArgs e) { // This is called on the worker thread FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); …


3
std :: atomic到底是什么?
我明白那个 std::atomic<>是一个原子对象。但是原子到什么程度呢?据我了解,操作可以是原子的。使对象原子化的确切含义是什么?例如,如果有两个线程同时执行以下代码: a = a + 12; 那么整个操作(比如说add_twelve_to(int))是原子的吗?还是对变量atomic进行了更改(so operator=())?

7
从技术上讲,为什么Erlang中的进程比OS线程更有效率?
Erlang的特征 来自Erlang编程(2009): Erlang并发是快速且可扩展的。它的进程是轻量级的,因为Erlang虚拟机不会为每个创建的进程创建一个OS线程。它们是在VM中创建,计划和处理的,与基础操作系统无关。结果,进程创建时间约为微秒,并且与同时存在的进程数无关。将此与Java和C#进行比较,在Java和C#中为每个进程创建一个底层OS线程:您将获得一些非常有竞争力的比较,其中Erlang的性能大大优于两种语言。 摘自Erlang的面向并发编程(pdf) (幻灯片)(2003): 我们观察到,创建一个Erlang进程所花费的时间在2,500个进程中恒定为1µs。此后,对于多达30,000个处理,它增加到大约3µs​​。图的顶部显示了Java和C#的性能。对于少量的过程,创建一个过程大约需要300µs。创建两千多个流程是不可能的。 我们看到,对于多达30,000个进程,在两个Erlang进程之间发送消息的时间约为0.8µs。对于C#,每条消息大约需要50µs的时间,最多不超过最大进程数(大约1800个进程)。Java甚至更糟,对于多达100个进程,每条消息花费大约50µs的时间,此后,当大约有1000个Java进程时,它迅速增加到每条消息的10ms。 我的想法 我从技术上不完全理解为什么Erlang进程在生成新进程时效率如此之高,而每个进程的内存占用却少得多。OS和Erlang VM都必须进行调度,上下文切换,并跟踪寄存器中的值等等。 就是为什么OS线程的实现方式与Erlang中的进程不同?他们还需要更多支持吗?为什么他们需要更大的内存空间?为什么它们的生成和通讯速度较慢? 从技术上讲,在生成和通信方面,为什么Erlang中的进程比OS线程更有效?为什么不能以同样有效的方式来实现和管理操作系统中的线程?为何OS线程占用的内存更大,并且生成和通讯速度较慢? 更多阅读 专注于SMP的Erlang VM内部(2008) Java和Erlang中的并发性(pdf)(2004) Java和进程中的线程的性能度量(Erlang,1998年)

2
Redis是单线程的,那么它如何执行并发I / O?
为了掌握Redis的一些基础知识,我遇到了一篇有趣的博客文章。 作者指出: Redis是带有epoll / kqueue的单线程,并且在I / O并发方面可以无限​​扩展。 我肯定会误解整个线程问题,因为我发现此语句令人困惑。如果程序是单线程的,它如何并发执行任何操作?如果服务器仍然是单线程的,为什么Redis操作是原子的那么好呢? 有人可以阐明这个问题吗?

11
BackgroundWorker vs背景线程
我对应该在Windows Form应用程序上使用的后台线程实现的选择有一个风格上的问题。目前,我BackgroundWorker在具有无限(while(true))循环的表单上。在此循环中,我用于WaitHandle.WaitAny保持线程休眠,直到发生感兴趣的事情为止。我等待的事件句柄之一是“ StopThread”事件,因此我可以跳出循环。从我重写时发出此事件信号Form.Dispose()。 我读过某个地方,该地方BackgroundWorker实际上是您不希望将UI与之捆绑在一起并具有有限结局的操作-例如下载文件或处理一系列项目。在这种情况下,“结束”是未知的,只有在关闭窗口时才知道。因此,对我而言,使用后台线程而不是BackgroundWorker为此目的更合适吗?

9
为什么在多线程C或C ++编程中不认为volatile有用?
正如我最近发布的答案所表明的那样,我似乎对volatile多线程编程上下文中的实用程序(或缺少实用程序)感到困惑。 我的理解是:只要变量可以在访问代码的控制流之外更改,则该变量应声明为volatile。信号处理程序,I / O寄存器以及由另一个线程修改的变量都构成了这种情况。 因此,如果您有一个全局int foo,并且foo被一个线程读取,并由另一个线程自动设置(可能使用适当的机器指令),则读取线程会以这种方式看到这种情况,就像看到一个由信号处理程序或由外部硬件条件修改,因此foo应声明volatile(或在多线程情况下,以内存限制的负载访问,这可能是一个更好的解决方案)。 我怎么在哪里错?

17
如何从线程中捕获异常
我有Java主类,在该类中,我启动了一个新线程,在主类中,它等待线程死亡。在某个时刻,我从线程中抛出了运行时异常,但是我无法在主类中捕获从线程中抛出的异常。 这是代码: public class Test extends Thread { public static void main(String[] args) throws InterruptedException { Test t = new Test(); try { t.start(); t.join(); } catch(RuntimeException e) { System.out.println("** RuntimeException from main"); } System.out.println("Main stoped"); } @Override public void run() { try { while(true) { System.out.println("** Started"); sleep(2000); throw …


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.