Articles of multithreading

如何调度/创build用户级线程,以及如何创build内核级线程?

道歉,如果这个问题是愚蠢的。 我试图在网上find一个相当长的答案,但不能,所以我在这里问。 我正在学习线程,而且我一直在浏览这个链接和这个关于内核级和用户级线程的Linux Plumbers Conference 2013video ,并且据我所知,使用pthreads在用户空间创build线程,内核不知道关于这个,并且只将它视为一个单独的进程,不知道里面有多less个线程。 在这种情况下, 谁决定这些用户线程在进程获得的时间片期间的调度,因为内核把它视为单个进程并且不知道线程,调度是如何完成的? 如果pthread创build用户级别的线程,如果需要,如何从用户空间程序创build内核级别或操作系统线程? 根据上面的链接,它说操作系统内核提供系统调用来创build和pipe理线程。 那么clone()系统调用是创build一个内核级线程还是用户级线程? 如果它创build了一个内核级线程,那么一个简单的pthreads程序的 strace也会显示在执行时使用clone(),但为什么会被认为是用户级线程呢? 如果它不创build内核级线程,那么如何从用户空间程序创build内核线程? 根据链接,它说:“每个线程需要一个完整的线程控制块(TCB)来维护关于线程的信息,结果造成了很大的开销和内核复杂度的增加”,所以在内核级线程中,堆是共享的,其余的都是个人的线程? 编辑: 我在询问用户级线程的创build,因为这里有一个对许多对一个模型的引用,许多用户级线程映射到一个内核级线程,线程pipe理在用户空间由线程库。 我只看到使用pthreads的引用,但不确定它是否创build用户级别或内核级别的线程。

Linux中的进程和线程之间的区别

在阅读了Robert Love的这个答案和“Linux Kernel Development”之后,随后在clone()系统调用中,我发现Linux中的进程和线程几乎与内核不可区分。 他们之间有一些调整(在所引用的SO问题中被讨论为“更多分享”或“更less分享”),但是我仍然有一些问题还有待回答。 我最近在一个涉及几个POSIX线程的程序上工作,并决定在这个前提下进行实验。 在创build两个线程的过程中,所有线程当然会得到由pthread_self()返回的唯一值, 但不是由getpid() 。 我创build的示例程序如下: #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <unistd.h> #include <pthread.h> void* threadMethod(void* arg) { int intArg = (int) *((int*) arg); int32_t pid = getpid(); uint64_t pti = pthread_self(); printf("[Thread %d] getpid() = %d\n", intArg, pid); printf("[Thread %d] pthread_self() = %lu\n", intArg, pti); } int main() […]

Linux计划一个进程或线程?

读完这个问题后,我有一些疑问。 请帮助理解。 调度涉及决定何时运行一个过程以及多less时间。 Linux内核调度一个线程或进程? 由于进程和线程在内核中没有区别,调度程序如何处理它们? 每个线程的量子是如何决定的? 一个。 如果一个时间量(比如说100us)被确定为一个进程,那么在进程的所有线程之间进行共享? 或者b。 调度程序决定每个线程的量程? 注意:问题1和问题2是相关的,可能看起来一样,但只是想澄清事情的工作原理。

从后台工作线程修改Qt GUI

我在Qt中工作,当我按下GObutton时,我需要不断地将包发送到networking,并使用我收到的信息修改接口。 问题是,我有一段while(1)在button,所以button永远不会完成,所以接口永远不会更新。 我想在button中创build一个线程,并把while(){}代码放在那里。 我的问题是我怎样才能从线程修改接口? (例如,我怎样才能从线程修改文本框?

Tomcat不停止。 我怎样才能debugging呢?

我有一个运行在Linux中的Tomcat 7 ,通过$CATALINA_HOME/bin/startup.sh启动,并通过$CATALINA_HOME/bin/shutdown.sh 来自/etc/init.d 除了1个问题,一切都可以。 有时候tomcat不会停止。 虽然我停下来,我看到在catalina.out日志下降,如果我做ps -ef我仍然可以看到进程运行。 可能是什么问题呢? 我怎样才能debugging呢? 我的感觉是,这与线程有关。 所以可疑的部分如下: 1)我使用Log4j的LogManager来检测log4jconfiguration是否已经改变,但是我做Log4jManager.shutdown的contextDestroyed ServletContextListener 2)我使用H2数据库,我看到关机: 严重:Web应用程序[/ MyApplication]似乎已经开始了 线程命名为[H2 Log Writer MYAPPLICATION],但未能阻止它。 这很可能造成内存泄漏 严重:Web应用程序[/ MyApplication]似乎已经开始了 线程命名为[H2 File Lock Watchdog /opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase.lock.db],但已 未能阻止它。 这很可能造成内存泄漏。 Apr 2, 2012 9:08:08 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads SEVERE:Web应用程序[/ MyApplication] 似乎已经启动了一个名为[FileWatchdog]的线程,但失败了 停止它。 这很可能造成内存泄漏。 请帮忙吗? 我怎样才能在这里发现问题? 更新: 我按照@daveb的build议kill -3 ,在catalina.out中我看到: JVMDUMP006I正在处理转储事件“user”,详细信息“” – 请稍候。 JVMDUMP032I JVM使用“/etc/init.d/javacore.20120402.093922.2568.0001.txt”请求Java转储以响应事件JVMDUMP010I写入到/etc/init.d/javacore.20120402.093922.2568.0001.txt的Java转储JVMDUMP013I处理的转储事件“用户”,详细信息“”。 /etc/init.d有一个javacore,但我不知道如何处理它。 即我应该调查哪些部分

如何防止作者在pthreads读写locking中的饥饿

我有一些关于* nix系统上的POSIX Pthreads读写锁的问题,比如Linux。 我想知道什么是读写锁的默认偏见,即它喜欢读取写入,反之亦然? 它是否提供了一些API来改变这种默认行为。 posix pthread是否提供了一些API,以便我们可以更改pthread_rwlock_t以防止作者饿死? 从我读过的(请纠正我,如果我错了),默认实现偏向读者线程,所以写作线程可能面临饥饿。 我已经阅读了由David Butenhof编写的使用Posix线程编程的书中rw锁的示例实现。 我想知道posix pthreads如何处理作家线程的饥饿? 是否有一些使用我们可以设置读写锁的属性,以防止写挨饿(我从来没有听说过)? 或者用户不得不处理这个问题? 如果你认为答案是实现定义的,那么请举例说明在Linux中是如何完成的,因为那就是我正在寻找的。 请注意,我只想要一个* nix系统的解决scheme。 不要以为我很粗鲁,但发布一些特定于Windows的代码对我来说是无用的。 谢谢大家的帮助和耐心:)

防止Linux线程被调度程序中断

你如何告诉Linux中的线程调度程序不要因为任何原因中断你的线程? 我正在用户模式下编程。 简单地locking一个互斥体是否可以实现这个function? 我想阻止在执行某个函数时调度进程中的其他线程。 他们会阻止,我会浪费cpu周期与上下文切换。 我希望任何执行该函数的线程都能够在不中断的情况下完成执行,即使超过了线程的时间片也是如此。

获取其他线程的回溯

在Linux中,为了获得回溯,可以使用backtrace()库调用,但它只返回当前线程的回溯。 有什么办法得到其他线程的回溯,假设我知道它是TID(或pthread_t),我可以保证睡觉? 看来,libunwind(http://www.nongnu.org/libunwind/)项目可以提供帮助。 问题是CentOS不支持它,所以我不喜欢使用它。 任何其他的想法? 谢谢。

在Linux中等待WaitForSingleObject和WaitForMultipleObjects

我正在从Windows到Linux迁移应用程序。 我WaitForSingleObject和WaitForMultipleObjects接口的问题。 在我的应用程序中,我产生了多个线程,其中所有线程都等待来自父进程的事件,或者每t秒周期运行一次。 我已经检查了pthread_cond_timedwait ,但是我们必须为此指定绝对时间。 我怎么能在Unix中实现这个?

Thread.Sleep(0):什么是正常的行为?

为了理解Thread.Sleep(0)在OS上强制上下文切换。 我想查看在接收一些CPU时间之前可以传递给应用程序的最大时间。 所以我构build了一个在while循环(c#)中执行Thread.Sleep(0)的应用程序,并计算每次调用之间传递的时间。 当这个应用程序是唯一在双核心testingPC上运行的应用程序时,最大观察时间正好在1毫秒(平均为0.9微秒),它使用所有可用的CPU(100%)。 当我沿着CPU填充虚拟应用程序(全部具有相同的优先级)运行它时,最大时间约为25ms,平均时间为20ms。 它的行为完全如我所料。 时间非常稳定。 每当CPU获得一些CPU时间时,立即将控制权交还给需要处理的人,这就像热土豆游戏(CPU使用率下降到0%)。 如果没有其他应用程序正在运行,则控件立即返回。 鉴于此行为,我预计此应用程序对运行实际应用程序的计算机具有最小的影响。 (并给我实际的“延迟”,我期望看到在那里运行的应用程序)。 但令我惊讶的是,这确实影响了(以可观察的方式)这个特定系统的performance。 我是否错过了有关Thread.Sleep(0)的一些重要观点? 作为参考这里是这个应用程序的代码 private bool _running = true; private readonly Stopwatch _timer = new Stopwatch(); private double _maxTime; private long _count; private double _average; private double _current; public Form1() { InitializeComponent(); Thread t = new Thread(Run); t.Start(); } public void Run() { while(_running) { […]