Articles of multithreading

内存屏障和atomic_t在Linux上

最近,我正在阅读一些Linux内核空间代码,我看到了这一点 uint64_t used; uint64_t blocked; used = atomic64_read(&g_variable->used); //#1 barrier(); //#2 blocked = atomic64_read(&g_variable->blocked); //#3 这段代码的语义是什么? 是否确定#1在#3之前执行#2。 但是我有点困惑,因为 #A在64位平台上,atomic64_readmacros被扩展为 used = (&g_variable->used)->counter // where counter is volatile. 在32位平台上,它被转换为使用lockingcmpxchg8b 。 我假设这两个语义相同,对于64位版本,我认为这意味着: 我们可以排除地址不alignment,字大小大于CPU本地字大小的情况。 没有优化 ,强制CPU从内存位置读取。 atomic64_read没有语义保存阅读顺序! 看到这个 #B 屏障macros被定义为 /* Optimization barrier */ /* The "volatile" is due to gcc bugs */ #define barrier() __asm__ __volatile__("": : […]

限制在函数签名中的含义是什么?

int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg); 我想知道限制的含义是什么?

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);