Articles of multithreading

从后台工作线程修改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) { […]

如何获得Win32线程的名称?

我知道在Windows下设置线程名称的非直观过程(请参阅“ 如何将名称设置为Win32线程? ”)。 有没有办法获得线程的名称? 我没有看到任何Windows API允许我这样做( http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx )。

在Windows中更改提升线程优先级

我试图改变线程的优先级,但即时通讯没有运气。 我从GetLastError函数得到一个错误的句柄错误(types6)。 我虽然native_handle()返回线程的句柄? 有人知道怎么做吗? void baseThread::applyPriority(uint8 priority) { #ifdef WIN32 if (!m_pThread) return; BOOL res; HANDLE th = m_pThread->native_handle(); switch (priority) { case REALTIME : res = SetPriorityClass(th, REALTIME_PRIORITY_CLASS); break; case HIGH : res = SetPriorityClass(th, HIGH_PRIORITY_CLASS); break; case ABOVE_NORMAL : res = SetPriorityClass(th, ABOVE_NORMAL_PRIORITY_CLASS); break; case NORMAL : res = SetPriorityClass(th, NORMAL_PRIORITY_CLASS); break; case […]

如何以编程方式获取Windows进程的线程数?

我想通过C / C ++来计算当前Windows进程的本地线程。 我看到有一个与 .NET的答案有关的问题 ,但我不能使用该解决scheme。 我怀疑有可能通过PdhOpenQuery / PdhCollectQueryData解决scheme,但我还没有探索这个方向,我希望有一个更简单的方法。 更新:我应该说,我目前的实施使用CreateToolhelp32Snapshot / Thread32First / Thread32Next,这就是我想要取代。 这个实现是严厉的,在我的过程中每次调用都会导致20,000页的错误。 也许我只是用它错了? Update2:最适合我的解决scheme是使用我感兴趣的进程的PID作为 “\ Process( _)\ Thread Count”这样的string。然后我调用PdhExpandWildCardPath()来扩展“ ”通配符。 然后我调用PdhOpenQuery(),PdhAddCounter()和PdhCollectQueryData()来初始化。 此后,我调用PdhCollectQueryData()和PdhGetFormattedCounterValue()定期获取我的值。