Articles of multithreading

CPU亲和力口罩(把线程放在不同的CPU上)

我有4个线程,我想设置线程1在CPU 1上运行,CPU 2上的线程2等。但是,当我运行我的代码下面,亲和力掩码返回正确的值,但是当我做sched_getcpu()在线程上,它们都返回它们在CPU 4上运行。 有人知道我的问题在这里? 提前致谢! #define _GNU_SOURCE #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <sched.h> #include <errno.h> void *pthread_Message(char *message) { printf("%s is running on CPU %d\n", message, sched_getcpu()); } int main() { pthread_t thread1, thread2, thread3, thread4; pthread_t threadArray[4]; cpu_set_t cpu1, cpu2, cpu3, cpu4; char *thread1Msg = "Thread 1"; char *thread2Msg = "Thread […]

我可以从指针地址(Linux上的C)获得NUMA节点吗?

我已经设置了我的代码,仔细地在我的NUMA系统上本地加载和处理数据。 我认为。 也就是说,为了debugging的目的,我真的希望能够使用指针地址在一个特定的函数内被访问,这个函数已经被许多其他函数设置,直接标识内存指向的NUMA节点正在居住,所以我可以检查一切都位于它应该位于的地方。 这可能吗? 我在msdn http://social.msdn.microsoft.com/Forums/en-US/parallelcppnative/thread/37a02e17-e160-48d9-8625-871ff6b21f72find这个请求为同样的事情,但答案使用QueryWorkingSetEx()似乎是Windows特定的。 这可以在Linux上完成吗? 我在Debian Squeeze上,确切地说, 谢谢。

如何join挂在阻塞IO上的线程?

我有一个线程在后台运行,从input设备以阻塞的方式读取事件,现在当我退出应用程序我想正确清理线程,但我不能只运行一个pthread_join(),因为线程由于阻塞IO而永远不会退出。 我如何正确地解决这种情况? 我应该发送一个pthread_kill(theard,SIGIO)还是一个pthread_kill(theard,SIGALRM)来打破这个块? 这是否是正确的信号? 还是有另一种方法来解决这种情况,让该子线程退出阻塞阅读? 目前有点困惑,因为我的search没有find解决scheme。 这是在Linux上,并使用pthreads。 编辑:我玩了一些SIGIO和SIGALRM,当我没有安装信号处理程序,他们打破封锁IO,但给控制台上的消息(“I / O可能”),但是当我安装一个信号处理程序,为了避免这个消息,它们不再中断阻塞IO,所以线程不会终止。 所以我回到第一步。

pthread_detach问题

直到最近,我的印象是,如果在产生它之后“分离”一个线程,即使在“主”线程终止之后线程仍然存在。 但是一个小实验(下面列出)违背了我的信念。 我期望分离的线程继续打印“从分离的线程说话”,即使在主要终止后,但这似乎并没有发生。 应用程序显然终止… 在“主要”问题返回0之后,“分离”线程是否会死亡? #include <pthread.h> #include <stdio.h> void *func(void *data) { while (1) { printf("Speaking from the detached thread…\n"); sleep(5); } pthread_exit(NULL); } int main() { pthread_t handle; if (!pthread_create(&handle, NULL, func, NULL)) { printf("Thread create successfully !!!\n"); if ( ! pthread_detach(handle) ) printf("Thread detached successfully !!!\n"); } sleep(5); printf("Main thread dying…\n"); return […]

如何使用strace跟踪subprocess?

我用strace简单地附加到一个过程。 该进程创build了90个线程。 当我发现有问题的线程时,我不得不单调地search父线程,然后是祖父线程,一直到根进程。 有没有一个技巧或工具来快速找出哪个线程创build另一个线程? 或者更好的是,像pstree一样打印线程创build树?

分叉与线程

我之前在我的应用程序中使用了线程,并且很好地了解了它的概念,但是最近在我的操作系统讲座中遇到了fork()。 这与线程相似。 我谷歌search他们之间的差异,我来知道: 叉只不过是一个新的过程,看起来完全像旧的或父过程,但它仍然是一个不同的过程,具有不同的过程ID和拥有自己的记忆。 线程是轻量级的过程,具有较less的开销 但是,我脑海里还有一些问题。 你应该什么时候更喜欢叉(),而不是线程和副诗? 如果我想调用一个外部应用程序作为一个孩子,那么我应该使用fork()或线程来做到这一点? 在search谷歌时,我发现有人说在一个线程中调用一个fork()是件坏事。 为什么当人们做类似的事情时,人们想在线程中调用一个fork()? 是否真的fork()不能利用多处理器系统,因为父进程和subprocess不能同时运行?

使std :: cin语句自动超时

我写了这个程序 #include<iostream> using namespace std; int n; int main(int argc, char *argv[]) { std::cout << "Before reading from cin" << std::endl; // Below reading from cin should be executed within stipulated time bool b=std::cin >> n; if (b) std::cout << "input is integer for n and it's correct" << std::endl; else std::cout << "Either n […]

pthread_cond_wait和pthread_mutex_lock优先级?

我有多个读取线程和一个写入线程。 如果我在其中一个读线程上locking了互斥并且从它发送了广播,那么保证互斥将被等待在pthread_cond_wait()上的写入线程locking,或者有可能在pthread_mutex_lock()上包含的另一个读线程locking互斥? 主要问题是pthread_cond_wait()的优先级高于pthread_mutex_lock()吗? 如果没有,我怎样才能实现互斥锁总是会被写在pthread_cond_broadcast()上的线程locking? 例 阅读主题: pthread_mutex_lock(mutex); pthread_cond_broadcast(cond); pthread_mutex_unlock(mutex); 写线程: pthread_mutex_lock(&mutex); pthread_cond_wait(&cond, &mutex);

在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 […]