Articles of multithreading

C读和线程安全(linux)

如果在同一个文件描述符(让我们感兴趣的是一个本地文件,它是一个套接字文件描述符)中调用两个不同的线程中的read (或write ,或两者),将会发生什么情况,而不使用显式的同步机制? 读和写是系统调用,因此,在单核CPU上,两个读操作可能同时执行可能是不吉利的。 但是,多核心… Linux内核将会做什么? 让我们来更一般一点:其他内核(如BSD)的行为总是一样的吗? 编辑:根据closures的文档 ,我们应该确保该文件描述符不被其他线程中的系统调用使用。 因此,在closures一个文件描述符之前,需要明确的同步(如果线程可能调用它仍然在运行,那么还需要读/写)。

我想等待一个文件描述符和一个互斥量,推荐的方法是什么?

我想产生线程来执行某些任务,并使用线程安全队列与他们进行通信。 在等待的时候,我也想对各种文件描述符进行IO操作。 推荐的方法是什么? 当队列从没有元素到某些元素时,我是否必须创build一个线程间pipe道并写入它? 没有更好的方法吗? 如果我必须创build线程间pipe道,为什么没有实现共享队列的库允许您创build共享队列和线程间pipe道作为单个实体? 我想这么做是否意味着一个基本的devise缺陷? 我正在问这个关于C ++和Python的问题。 我对一个跨平台的解决scheme很感兴趣,但主要对Linux感兴趣。 更具体的例子 我有一些代码将在文件系统树中search的东西。 我有几个通过sockets向外界开放的沟通渠道。 可能(或不可能)导致需要search文件系统树中的东西的请求将到达。 我将隔离在一个或多个线程中search文件系统树中的东西的代码。 我想要请求导致需要search树,并把它们放在一个线程安全的队列中,由search器线程完成。 结果将被放入已完成search的队列中。 我希望能够在search过程中快速处理所有的非search请求。 我希望能够及时处理search结果。 处理传入的请求通常意味着某种使用epoll的事件驱动架构。 磁盘search请求队列和结果返回队列将暗示使用互斥或​​信号量来实现线程安全的线程安全队列。 等待空队列的标准方法是使用条件variables。 但是如果我在等待的时候需要处理其他的请求,那将是行不通的。 要么我总是轮询结果队列(并且平均延迟轮询间隔的一半),阻塞和不处理请求。

NPTL在65528处限制最大线程数?

下面的代码应该是100,000个线程: /* compile with: gcc -lpthread -o thread-limit thread-limit.c */ /* originally from: http://www.volano.com/linuxnotes.html */ #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <pthread.h> #include <string.h> #define MAX_THREADS 100000 int i; void run(void) { sleep(60 * 60); } int main(int argc, char *argv[]) { int rc = 0; pthread_t thread[MAX_THREADS]; printf("Creating threads …\n"); for (i = […]

multithreadingrandom_r比单线程版本慢

以下程序基本上与此处所述的程序相同。 当我使用两个线程(NTHREADS == 2)运行和编译程序时,我得到以下运行时间: real 0m14.120s user 0m25.570s sys 0m0.050s 当它只用一个线程(NTHREADS == 1)运行时,即使只使用一个内核,运行时间也会显着提高。 real 0m4.705s user 0m4.660s sys 0m0.010s 我的系统是双核的,我知道random_r是线程安全的,我很确定它是非阻塞的。 当同样的程序在没有random_r的情况下运行并且余弦和正弦的计算被用作replace时,双线程版本运行的时间大约是预期的1/2。 #include <pthread.h> #include <stdlib.h> #include <stdio.h> #define NTHREADS 2 #define PRNG_BUFSZ 8 #define ITERATIONS 1000000000 void* thread_run(void* arg) { int r1, i, totalIterations = ITERATIONS / NTHREADS; for (i = 0; i < totalIterations; […]

如何杀死多处理模块创build的僵尸进程?

我对multiprocessing模块很multiprocessing 。 我只是试图创build以下内容:我有一个进程是从RabbitMQ获取消息并将其传递给内部队列( multiprocessing.Queue )。 然后,我想要做的是:当新消息进来时产生一个进程。它可以工作,但是在作业完成后,它会留下一个没有被父节点终止的僵尸进程。 这是我的代码: 主要stream程: #!/usr/bin/env python import multiprocessing import logging import consumer import producer import worker import time import base conf = base.get_settings() logger = base.logger(identity='launcher') request_order_q = multiprocessing.Queue() result_order_q = multiprocessing.Queue() request_status_q = multiprocessing.Queue() result_status_q = multiprocessing.Queue() CONSUMER_KEYS = [{'queue':'product.order', 'routing_key':'product.order', 'internal_q':request_order_q}] # {'queue':'product.status', # 'routing_key':'product.status', # 'internal_q':request_status_q}] def main(): […]

如何在Linux上对clone()系统调用进行mmap映射?

Linux上的clone()系统调用需要一个指向堆栈的参数,供新创build的线程使用。 做到这一点的显而易见的方法是简单地malloc一些空间,并通过它,但是你必须确保你已经malloc'd尽可能多的堆栈空间,因为该线程将使用(很难预测)。 我记得使用pthreads时,我不必这样做,所以我很好奇它做了什么。 我遇到这个网站 ,它解释说:“Linux pthreads实现使用的最好的解决scheme是使用mmap分配内存,标记指定了使用时分配的内存区域,这样内存分配给如果系统不能分配额外的内存,则会发生分段违规。 我曾经听过mmap用过的唯一的上下文是将文件映射到内存中,并且确实读取了mmap手册页,它使用文件描述符。 这怎么可以用来分配一个dynamic长度的堆栈给clone()? 这个网站是疯了吗? ;) 无论哪种情况,内核都不需要知道如何为新的堆栈find一堆免费的内存,因为这是用户启动新进程时必须要做的事情。 为什么一个堆栈指针甚至需要首先指定,如果内核已经可以解决这个问题呢?

在Linux中使用硬件性能计数器

我想使用Intel和AMD x86_64多核处理器附带的硬件性能计数器来计算程序退役的商店数量。 我希望每个线程分别计算退休的商店。 可以这样做吗? 如果是这样,如何在C / C ++?

gdb:multithreading

我有一个使用两个线程的程序。 我已经把这个断点放在了两个线程中。 在gdb下运行程序时,我想在线程之间切换并使其运行。 (线程t1处于活动状态并正在运行,线程t2;在断点处暂停时,我想停止T1运行并运行T2)。 有什么办法可以在gdb中安排线程吗? 谢谢Arpit

在linux中的内存分配是否无阻塞?

我很好奇,知道是否使用默认的新运算符分配内存是一个非阻塞操作。 例如 struct Node { int a,b; }; … Node foo = new Node(); 如果多个线程试图创build一个新的节点,并且如果其中一个线程在分配过程中被操作系统暂停,是否会阻止其他线程的进展? 我问的原因是因为我有一个并发的数据结构,创build新的节点。 然后我修改了algorithm来回收节点。 这两种algorithm的吞吐量性能在24核心机器上几乎是相同的。 然后,我创build了一个在所有系统内核上运行的干扰程序,以便尽可能多地创build操作系统。 创build新节点的algorithm的吞吐量性能相对于再循环节点的algorithm减less了5倍。 我很想知道为什么会发生这种情况。 谢谢。 *编辑:指向我的Linux内存分配器的代码也将有所帮助。 我试图在发布这个问题之前寻找,但无法find它。

Linux系统调用创build进程和线程

我在一篇论文中读到,创build进程和线程的底层系统调用实际上是相同的,因此通过线程创build进程的成本并不是很高。 首先,我想知道创build进程/线程的系统调用是什么(可能是示例代码或链接?) 其次,作者是否正确地认为创build进程而不是线程是便宜的? 编辑: 引用文章: 使用进程replacepthread是非常便宜的,特别是在使用相同的底层系统调用调用pthread和进程的Linux上。