Articles of multithreading

在multithreading程序中捕获SIGSEGV和SIGFPE等信号

我正在尝试为在Linux上运行的程序编写一个multithreading的日志logging系统。 调用主程序线程中的日志系统将包含要login的数据的数据结构推入FIFO队列。 专用线程选取队列的数据并输出数据,而程序主线程继续其任务。 如果主程序导致SIGSEGV或其他信号被提出,我需要在终止之前确保队列是空的。 我的计划是使用pthread_sigmask http://man7.org/linux/man-pages/man3/pthread_sigmask.3.html对除一个线程外的所有信号屏蔽信号,但是请阅读http://man7.org上的信号列表/linux/man-pages/man7/signal.7.html我注意到: 对于整个过程(例如,当使用kill(2)发送)或针对作为结果产生的特定线程(例如,某些信号,例如SIGSEGV和SIGFPE)时,可以生成(因此未决)信号执行特定的机器语言指令是线程化的,就像使用pthread_kill(3))针对特定线程的信号一样。 如果我在所有线程上阻塞SIGSEGV而不是专用于捕获信号的线程,它会捕获由不同线程引发的SIGSEGV吗? 我发现了一个问题,在Linux中使用multithreading处理信号 ,但是我对于哪些信号是线程特定的以及如何捕捉它们一无所知。

multithreadingPython中的信号处理

这应该是非常简单,我很惊讶,我一直没有能够find这个问题已经在stackoverflow上已经回答。 我有一个像程序一样的守护进程,需要响应SIGTERM和SIGINT信号才能和新贵们一起工作。 我读过,最好的办法是在主线程的一个单独的线程中运行程序的主循环,让主线程处理信号。 然后,当收到一个信号时,信号处理程序应该通过设置在主循环中常规检查的标记标志来告诉主循环退出。 我试过这样做,但它不按我期望的方式工作。 请参阅下面的代码: from threading import Thread import signal import time import sys stop_requested = False def sig_handler(signum, frame): sys.stdout.write("handling signal: %s\n" % signum) sys.stdout.flush() global stop_requested stop_requested = True def run(): sys.stdout.write("run started\n") sys.stdout.flush() while not stop_requested: time.sleep(2) sys.stdout.write("run exited\n") sys.stdout.flush() signal.signal(signal.SIGTERM, sig_handler) signal.signal(signal.SIGINT, sig_handler) t = Thread(target=run) t.start() t.join() sys.stdout.write("join […]

获取GNU八度与多核处理器一起工作。 (multithreading)

我希望能够用GNU八度编程multithreading,所以它会利用多个处理器。 我在Fedora 17 Linux上安装了GNU Octave,并做了如下工作: yum install octave 在我的电脑上安装了最新版本的八度,3.6.2。 它工作的很好,但是当你把两个巨大的matrix放在一起的时候,它就会陷入一个八度使用的CPU。 如果matrix乘法利用所有内核,那将是很好的,因为在这种情况下,CPU显然是瓶颈。 八度可以充分利用多核处理器并在multithreading上运行吗? 是否有一个库或编译时间标志呢?

gcc 4.7在Linux pthreads – 非常规thread_local解决方法使用__thread(没有提升)

在C ++ 11中,可以使用thread_local存储来创build一个非平凡的对象: class X { … } void f() { thread_local X x = …; … } 不幸的是,这个function还没有在gcc中实现(从4.7开始)。 海湾合作委员会确实允许你有线程局部variables,但只有琐碎的types。 我正在寻找一个解决方法: 这是我到目前为止: #include <iostream> #include <type_traits> using namespace std; class X { public: X() { cout << "X::X()" << endl; }; ~X() { cout << "X::~X()" << endl; } }; typedef aligned_storage<sizeof(X), alignment_of<X>::value>::type XStorage; inline […]

在Linux中获取Java线程的线程ID

我有一个Java应用程序创build一些线程(通过new Thread() )。 使用ps我可以看到他们有不同的线程ID(LWP列),我想从Java应用程序中获得这些ID。 在大多数与本主题相关的post(例如, 本文 )中,解决scheme是使用ManagementFactory.getRuntimeMXBean().getName() 。 然而,使用这种方法,给了我主线程的PID(即使我从一个线程调用它),所以它不是真正解决我的问题。 有什么办法来获得应用程序创build的每个Thread的线程ID? 是否有可能使用JNI来实现它? 如果以某种方式,我可以连接到一个C函数,我可以调用syscall(__NR_gettid) ,这可以解决我的问题。 我真的不关心可移植性,所以我完全可以使用只适用于Linux机器的解决scheme。 更新:我实际上已经通过使用JNI解决了我的问题。 细节在我的答案中解释。 谢谢大家的build议/意见。

setitimer,SIGALRM和multithreading进程(linux,c)

我想在使用NPTL的libc的linux 2.6+中的multithreading进程中使用setitimer() (或更less的可能性, alarm() )。 哪个线程将从内核接收sigalarm (SIGALRM) ? 谢谢。 2014-04更新:如何在multithreading程序中设置setitimer() ,如果我想编写一个类似gperftools的cpuprofile的分析工具; 但在我的工具,我想支持dynamic链接的程序(所以有可能注入我自己的库到init分析)和静态链接的程序(没有做^^^^^^的可能性)。 我当前的分析工具在setitimer fork()和exec()之前设置setitimer ,它还使用ptrace来控制目标程序并劫持由setitimer生成的SIGPROF / SIGVPROF / SIGALRM。 我不知道它是如何与multithreading程序一起工作的。

如何用ps -axlfind在Linux上运行的Java线程?

我有一个运行两个线程的JVM。 是否有可能在我的Linux操作系统上使用ps -axl来查看这些正在运行的线程? 我试图找出操作系统给我的线程的优先级。 有关这个其他问题的更多信息。

如何增加最大数量的JVM线程(Linux 64位)

在15G内存的Linux机器上,我不能创build超过32k的Java线程。

我如何等待任何/所有的pthreads完成?

我只想让我的主线程在退出之前等待任何和所有的(p)线程完成。 线程出入有很多原因不同,我真的不想跟踪所有这些 – 我只是想知道他们什么时候都走了。 wait()为subprocess执行此操作,在没有subprocess的情况下返回ECHILD,但wait并不(看起来像)(p)线程。 我真的不想经历保持每一个未完成的线程列表的麻烦(因为他们来来去去),然后不得不每个调用pthread_join。 有没有一个快速和肮脏的方法来做到这一点?

如何使用PTRACE获得多个线程的一致视图?

当我正在处理这个问题时 ,我遇到了一个使用ptrace的可能的想法,但是我无法正确理解ptrace如何与线程交互。 假设我有一个给定的,multithreading的主进程,我想附加到它的一个特定的线程(也许从一个分叉的孩子)。 我可以附加到特定的线程? (手册在这个问题上有分歧。) 如果是这样,这是否意味着单步只通过一个线程的指示? 它是否会停止所有进程的线程? 如果是这样,当我调用PTRACE_SYSCALL或PTRACE_SINGLESTEP ,或所有线程继续时,所有其他线程保持停止? 有一种方法只能在一个单线程中前进,但保证其他线程保持停止状态? 基本上,我想通过强制所有线程停止来同步原始程序,然后通过单步执行一个跟踪线程来执行一小组单线程指令。 我个人的尝试迄今看起来有点像这样: pid_t target = syscall(SYS_gettid); // get the calling thread's ID pid_t pid = fork(); if (pid > 0) { waitpid(pid, NULL, 0); // synchronise main process important_instruction(); } else if (pid == 0) { ptrace(target, PTRACE_ATTACH, NULL, NULL); // does this work? // […]