Questions tagged «multithreading»

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

6
什么是编组?当某些东西被“编组”时会发生什么?
我知道至少在这里有人问过这个问题。 但是没有一个令人满意的答案,至少对我来说不是。关于与非托管代码进行互操作方面的封送讨论很多,但是从一个线程到另一个线程进行封送又是怎么回事,就像我们有时在.NET中要做的那样。 这使我问,什么是编组,真的吗?当给出编组的定义时,如何定义它以便解释互操作性的情况以及线程之间“编组”的情况?

11
从UI线程强制进行GUI更新
在WinForms中,如何从UI线程强制立即进行UI更新? 我正在做的大致是: label.Text = "Please Wait..." try { SomewhatLongRunningOperation(); } catch(Exception e) { label.Text = "Error: " + e.Message; return; } label.Text = "Success!"; 在操作之前,标签文本未设置为“ Please Wait ...”。 我使用另一个线程解决了这个问题,但是它变得繁琐,我想简化代码。

6
如何在不使用<mutex>的情况下在C ++ 11中实现多线程安全单例
既然C ++ 11具有多线程功能,我想知道在不使用互斥对象的情况下实现延迟初始化单例的正确方法是什么(出于性能原因)。我想到了这一点,但是tbh Im并不太擅长编写无锁代码,因此Im正在寻找更好的解决方案。 // ConsoleApplication1.cpp : Defines the entry point for the console application. // # include &lt;atomic&gt; # include &lt;thread&gt; # include &lt;string&gt; # include &lt;iostream&gt; using namespace std; class Singleton { public: Singleton() { } static bool isInitialized() { return (flag==2); } static bool initizalize(const string&amp; name_) …

3
GCC 4.8中C ++ 11 thread_local变量的性能损失是多少?
从GCC 4.8变更日志草案中: G ++现在实现了C ++ 11 thread_local关键字;这与GNU__thread关键字的主要区别在于它允许动态初始化和销毁​​语义。不幸的是,此支持要求引用非函数局部thread_local变量,即使它们不需要动态初始化也需要运行时惩罚 ,因此用户可能希望继续使用__thread具有静态初始化语义的TLS变量。 这种运行时惩罚的本质和来源到底是什么? 显然,要支持非函数局部thread_local变量,在进入每个线程主线程之前都需要一个线程初始化阶段(就像全局变量有一个静态初始化阶段一样),但是它们是否指的是超出此范围的运行时代价? ? 粗略地说,gcc的thread_local新实现的体系结构是什么?


1
在谈论线程和进程时,为什么说“不要同时格式化软盘”的评论很有趣?
我正在阅读线程和进程之间的区别,并遇到了用户在第二个答案中留下的评论,其中指出 只要您不同时格式化软盘。 它有27个投票,但没有人解释其背后的原因。 我想知道评论者说上述评论时的意思? 有人可以建议一个更有意义的问题名称来反映问题的内容吗

3
Lock和RLock有什么区别
从文档: threading.RLock()-一个工厂函数,返回一个新的可重入锁对象。可重入锁必须由获取它的线程释放。一旦线程获取了可重入锁,同一线程就可以再次获取它而不会阻塞;线程必须在每次获取它后释放一次。 我不确定为什么我们需要这个?Rlock和之间有什么区别Lock?

4
是否可以确定持有互斥锁的线程?
首先,我使用pthread库编写多线程C程序。线程总是被等待的互斥锁挂起。当我使用strace实用程序查找线程处于FUTEX_WAIT状态时,我想知道当时哪个线程持有该互斥量。但是我不知道该怎么做。有没有公​​用事业可以做到这一点? 有人告诉我Java虚拟机支持此功能,因此我想知道Linux是否支持此功能。

1
如何在gdb中禁用新线程/退出线程的消息?
我正在调试应用程序,并且收到很多这样的消息: [New Thread 0x7fffde152700 (LWP 11142)] [Thread 0x7fffde152700 (LWP 11142) exited] [New Thread 0x7fff967fa700 (LWP 11143)] [Thread 0x7fff967fa700 (LWP 11143) exited] [New Thread 0x7fff967fa700 (LWP 11144)] [Thread 0x7fff967fa700 (LWP 11144) exited] [New Thread 0x7fff967fa700 (LWP 11145)] [Thread 0x7fff967fa700 (LWP 11145) exited] [New Thread 0x7fffde152700 (LWP 11146)] [Thread 0x7fffde152700 (LWP 11146) …


6
python能够在多个内核上运行吗?
问题:由于python使用“ GIL”,python是否能够同时运行其单独的线程? 信息: 看完这篇文章后,我对python是否能够利用多核处理器的不确定性产生了怀疑。尽管python做得很好,但认为它缺乏如此强大的功能实在是很奇怪。因此,我感到不确定,因此决定在这里提问。如果我编写的程序是多线程的,那么它是否可以在多个内核上同时执行?

6
阻塞队列和多线程使用者,如何知道何时停止
我有一个单一的线程生产者,它创建一些任务对象,然后将它们添加到一个ArrayBlockingQueue(具有固定大小)中。 我还启动了一个多线程使用者。这是作为固定线程池(Executors.newFixedThreadPool(threadCount);)构建的。然后,我向该threadPool提交一些ConsumerWorker实例,每个ConsumerWorker都引用了上述ArrayBlockingQueue实例。 每个这样的Worker将take()在队列中执行并处理任务。 我的问题是,什么时候不再需要其他工作,让工人知道的最佳方法是什么。换句话说,我如何告诉工人生产者已完成添加到队列,从这一点开始,每个工人在看到队列为空时都应停止。 我现在得到的是一个设置,其中,生产者使用一个回调初始化,当他完成工作(向队列中添加内容)时触发该回调。我还保留了我创建并提交给ThreadPool的所有ConsumerWorkers的列表。当生产者回叫告诉我生产者完成时,我可以将此告知每个工人。在这一点上,他们应该继续检查队列是否不为空,当队列为空时,它们应该停止,从而使我能够正常关闭ExecutorService线程池。是这样的 public class ConsumerWorker implements Runnable{ private BlockingQueue&lt;Produced&gt; inputQueue; private volatile boolean isRunning = true; public ConsumerWorker(BlockingQueue&lt;Produced&gt; inputQueue) { this.inputQueue = inputQueue; } @Override public void run() { //worker loop keeps taking en element from the queue as long as the producer is still running or …

4
函数是否是现代平台的有效内存屏障?
在我审阅的代码库中,我发现了以下成语。 void notify(struct actor_t act) { write(act.pipe, "M", 1); } // thread A sending data to thread B void send(byte *data) { global.data = data; notify(threadB); } // in thread B event loop read(this.sock, &amp;cmd, 1); switch (cmd) { case 'M': use_data(global.data);break; ... } 我对我的团队的资深成员对作者说:“保存”,这里没有内存屏障!您不保证global.data将其从缓存刷新到主内存。如果线程A和线程B将在其中运行两个不同的处理器-此方案可能会失败”。 高级程序员咧嘴笑着,慢慢地解释,好像在解释他的五岁男孩如何系鞋带:“听小男孩,在高负载测试和实际客户中,我们在这里看到了许多与线程相关的错误”,他停下来挠挠他长长的胡须,“但是这个习语从来没有犯过错误”。 “但是,它在书中说……” “安静!”他迅速向我嘘声,“也许从理论上讲不能保证,但实际上,您使用函数调用的事实实际上是内存障碍。编译器不会对指令进行重新排序global.data = data,因为它不知道是否任何在函数调用中使用它的人,x86架构将确保在线程B从管道读取命令时其他CPU将看到此全局数据,请放心,我们有很多现实问题需要担心。我们不需要在虚假的理论问题上投入额外的精力。 …

5
条件与等待通知机制
与传统的等待通知机制相比,使用Condition接口/实现的优点是什么?在这里,我引用道格·李(Doug Lea)的评论: 条件将对象监视方法(wait,notify和notifyAll)分解为不同的对象,从而通过与任意Lock实现结合使用,从而使每个对象具有多个等待集。如果Lock替换了同步方法和语句的使用,而Condition替换了Object监视方法的使用。 我看到这是实现等待/通知机制的一种更面向对象的方式。但是,与前者相比有没有明显的优势?

6
Java的Fork / Join与ExecutorService-什么时候使用?
我刚读完这篇文章:与Java-7 ForkJoinPool相比,Java-5 ThreadPoolExecutor有什么优势?并认为答案不够直接。 您能用简单的语言和示例来说明Java 7的Fork-Join框架与较旧的解决方案之间的权衡吗? 我还阅读了关于Java技巧的Google排名第一的提示:何时使用javaworld.com上的ForkJoinPool与ExecutorService,但是本文没有回答when的标题问题,它主要讨论的是api的区别...

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.