Articles of multithreading

处理超过1024个文件描述符,在Linux上使用C语言

我正在使用epoll(边缘触发)和线程的线程networking服务器上工作,我使用httperf来testing我的服务器。 到目前为止,它的性能performance非常好,或者接近发送请求的速度。 直到1024屏障,一切都减慢到大约30个请求/秒。 在Ubuntu 9.04 64位上运行。 我已经试过了: 增加文件描述符的ulimit数量,成功。 它不会改善超过1024个并发连接的性能。 andri @ filefridge:〜/ Dropbox / School / Group 452 /代码/服务器$ ulimit -n 20000 我很肯定,这个缓慢发生在操作系统发生事件发送到epoll之前(是的,我也增加了epoll的限制)。 我需要testing一下我的程序可以处理多less个并发连接,直到它开始变慢(没有操作系统的干扰)。 如何让我的程序运行超过1024个文件描述符? 这个限制可能是有原因的,但是为了基准的目的,我需要它。 更新 感谢所有的答案,但我认为我find了罪魁祸首。 在我的程序中重新定义了__FD_SETSIZE之后,所有东西都开始移动了很多。 当然ulimit也需要提出,但是没有__FD_SETSIZE我的程序永远不会利用它。

我可以同时从几个线程调用一个套接字的accept()吗?

我正在使用Linux 3.2.0,x86_64。 我可以同时从几个线程调用一个套接字的accept()吗?

如何让某些线程优先locking互斥锁使用PTHREADS

假设以下代码正在被10个线程执行。 pthread_mutex_lock(&lock) Some trivial code pthread_mutex_unlock(&lock) 为了说明的目的,可以说线程是T1,T2,T3 ….. T10。 我的要求是,只要T1或T2或T3(即T1,T2或T3中的任何一个)正在等待获取锁,另一个线程T4,T5,T6 ….. T10不应该能够获取锁,即T1,T2和T3应优先获取相对于其他线程的锁。 我想可以通过提高线程T1,T2和T3的优先级来完成 即这里是伪代码 if this thread is T1 or T2 or T3 increase its priority pthread_mutex_lock(&lock) Some trivial code pthread_mutex_unlock(&lock) if this thread is T1 or T2 or T3 decrease it priority to normal 请注意,我想要一个适用于Linux平台的解决scheme,并且应该使用pthreads。 我并不在乎任何其他平台。 另外请注意,我并不是真的想把这3个线程作为实时的,我希望他们展示他们的违规行为(调度和优先级),除了在上面提到的一小段代码中,我希望他们总是优先获取锁。 我已经阅读了一些关于Linux调度策略和调度优先级的手册页,但不能真正做出:( 这会工作吗? 你能帮我完成上述任务所需的确切的pthread API吗? 关心lali

对于pthread,如何从主线程中杀死子线程

我使用pthread_create来创build多个子线程。 一次,主线程想要杀死所有的子线程,否则会有分段失败。 我应该使用哪个函数来完成这个function? 我search了谷歌的答案,并得到像pthread_killfunction。 但是我不知道应该发送给子线程的信号来杀死它们。 我的运行环境是RHEL 5.4,编程语言是C.

Linux时间分割进程还是线程?

一位教授曾经在课堂上告诉我们,Windows,Linux,OS X和UNIX在线程上而不是在进程上扩展,因此,即使在单个处理器上,线程也可能会使应用程序受益,因为应用程序将在CPU上获得更多时间。 我试着用我的机器上的以下代码(它只有一个CPU)。 #include <stdio.h> #include <stdlib.h> #include <pthread.h> pthread_t xs[10]; void *nop(void *ptr) { unsigned long n = 1UL << 30UL; while(n–); return NULL; } void test_one() { size_t len = (sizeof xs) / (sizeof *xs); while(len–) if(pthread_create(xs+len, NULL, nop, NULL)) exit(EXIT_FAILURE); len = (sizeof xs) / (sizeof *xs); while(len–) if(pthread_join(xs[len], NULL)) exit(EXIT_FAILURE); } […]

跟踪线程内存和CPU消耗

我正在编写一个观察其他应用程序并跟踪资源消耗的Linux应用程序。 我正在计划使用Java,但编程语言对我来说并不重要。 目标很重要,所以我可以切换到其他技术或使用模块。 我的应用程序作为subprocess运行任何选定的第三方应用 大多数孩子软件解决了一些algorithm,如graphics,stringsearch等。观察程序跟踪孩子的资源,而它结束了工作。 如果子应用程序是multithreading的,也许有可能跟踪多less资源消耗每个线程? 可以使用任何非分配内存线程技术来编写应用程序:Java线程,Boost线程,POSIX线程,OpenMP,任何其他。

内存屏障和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上,确切地说, 谢谢。