Articles of multithreading

Android / Linux线程join超时

有没有pthreads API调用,可以做一些类似pthread_join()但超时? 我正在寻找一个类似于Windows WaitForSingleObject(HANDLE句柄,int超时)函数的函数。 我知道有一个pthread_timedjoin()调用,但只有某些版本的Linux(绝对不是在Android)上才可用。

Linux中的进程或线程级电源监视

我正在寻找一些能够为Linux操作系统提供进程或线程级功耗的工具。 我正在寻找类似于顶级,vmstat,mpstat,活动监视器(MAC)等与电力使用相似的东西,即使近似)。 我看到了Andorid PowerTutor的一个工具,可以为特定的Andorid手机做好工作。 是否有类似的工具,可以提供统计的笔记本电脑/台式机等的Linux操作系统? 任何build议表示赞赏。

为什么我的两个线程不能交错运行?

我今天写了一个pthread代码: #include <pthread.h> #include <stdio.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void *thread1(void *arg) { while (1) { pthread_mutex_lock(&mutex); sleep(1); printf("thread1…\n"); pthread_mutex_unlock(&mutex); } } void *thread2(void *arg) { while (1) { pthread_mutex_lock(&mutex); sleep(1); printf("thread2…\n"); pthread_mutex_unlock(&mutex); } } int main() { pthread_t tid1, tid2; pthread_create(&tid1, NULL, thread1, NULL); pthread_create(&tid2, NULL, thread2, NULL); pthread_join(tid1, NULL); pthread_join(tid2, NULL); return 0; […]

套接字描述符在为multithreadingUDP客户端执行“close()”时没有得到释放

我已经写了下面的UDP客户端,它基本上产生了一个单独的线程接收数据块,但是数据块只在主线程中发送。 现在,按下ctrl ^ D post实例化(“./udpClient 1”)在Linux发行版上的UDP客户端,实现从循环(围绕getline()调用)并closures套接字描述符。 我所观察到的,尽pipe调用closures描述符,直到客户端进程终止,仍然看到相关的条目执行“netstat -an | grep udp”时才释放。 但是,如果我注释/删除了产生接收者线程的代码,那么套接字描述符会在调用close()后立即被释放。 似乎套接字引用计数正在增加一个单独的线程(基本上接收和阻塞上述套接字描述符),因此close()调用什么也不做。 这是需要的,因为我的理解是,套接字引用计数增加,如果套接字描述符跨进程共享,但不跨线程? 是否因为线程的Linux实现为LWP,如果是的话,这是所需的行为? #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <errno.h> void *receiver (void *arg); int sockfd; int doConnect = 0; int main (int argc, char *argv[]) { pthread_t thrid; struct sockaddr_in servaddr; struct sockaddr_in clntaddr; char […]

发送TERM信号给在父进程的另一个线程中产生的subprocess

我在Linux平台上使用Perl。 首先我创build了一个线程,并在这个新线程中派生了一个subprocess。 当新线程中的父进程返回并join到主线程时,我想将TERM信号发送到创build线程中产生的subprocess,但信号处理程序不起作用,subprocess变成僵尸。 这是我的代码: use strict; use warnings; use Thread 'async'; use POSIX; my $thrd = async { my $pid = fork(); if ($pid == 0) { $SIG{TERM} = \&child_exit; `echo $$ > 1`; for (1..5) { print "in child process: cycle $_\n"; sleep 2; } exit(0); } else { $SIG{CHLD} = \&reaper; } }; […]

Linux线程ID比较

所以,我在结构列表中find一个当前的线程ID非常糟糕,它反映了关于线程的信息。 基本上,列表中的每个元素都有一个字段pthread_t id 。 我的searchfunction是这样的: int thread_pos(pthread_t tid) { int i; for (i = 0; i < my_threads.thread_num; i++) { printf("for: %d %d %d\n", my_threads.vector[i].id, tid, pthread_equal(my_threads.vector[i].id, tid)); if (pthread_equal(my_threads.vector[i].id, tid)) { printf("found\n"); return i; } } return -1; } 由于my_threads.vector中只有一个元素,所以会打印一行: 419817216 419817216 0 数据结构: struct my_thread_t { pthread_t id; }; struct my_threads_t { struct […]

在进程之间传递消息

我需要编写一个简单的函数,在linux中执行以下操作: 创build两个进程。 让Process1中的thread1执行一些小操作,并在操作完成后通过thread2发送消息给Process2。 * Process2应确认收到的消息。 我不知道从哪里开始 我已经写了两个简单的函数,从0到1000在一个循环(循环运行在一个线程调用的函数),我已经编译它们来获取二进制文件。 我正在执行一个接一个(在后台运行)从一个shell脚本 一旦process1在循环中达到1000,我希望第一个进程发送一个“Complete”消息给另一个。 我不确定我的方法在stream程方面是否正确,我完全不知道如何沟通这两者。 任何帮助将不胜感激。 迷失在太空

getchar和SIG34,即时事件34

我有一个multithreading程序。 主线程使用一个getchar来closures所有其他线程和它自己。 我有一个计时器function在一个子线程中使用。 此线程使用SIG34作为计时器到期。 在某些时候,我收到SIG34如下。 这影响了我的主线程中的getchar,我的程序只是中止。 请帮助我理解这一点。 Program received signal SIG34, Real-time event 34. 0x00007ffff6ea38cd in read () from /lib/x86_64-linux-gnu/libc.so.6 (gdb) bt #0 0x00007ffff6ea38cd in read () from /lib/x86_64-linux-gnu/libc.so.6 #1 0x00007ffff6e37ff8 in _IO_file_underflow () from /lib/x86_64-linux-gnu/libc.so.6 #2 0x00007ffff6e3903e in _IO_default_uflow () from /lib/x86_64-linux-gnu/libc.so.6 #3 0x00007ffff6e2fb28 in getchar () from /lib/x86_64-linux-gnu/libc.so.6 #4 0x0000000000401eef in main (argc=1, […]

高效地实时处理数据,并在C中推入数据库

我解决了遇到的其中一个问题,需要帮助进一步调整以获得性能。 会有一个apache模块通过http协议接收请求,并在几毫秒内响应。 它处理input参数并将其作为JSONlogging放入caching层。 (目前文本文件被用作caching)。 另一个asynchronous模块读取JSONlogging,烹饪并将它们推送到MongoDB中。 这可以避免由于MongoDB性能下降而导致的http响应延迟。 在Load Balancer下将会有多个机器(目前是12个),并且预计每天将有100 M个请求,当JSONlogging被写入文本文件时,这个请求的大小将会是〜10-15 GB。 基本上我正在寻找更好的数据摄取解决scheme。 关于在生产者消费者体系结构中使用ZeroMQ或RabbitMQ, 消息队列位于内存队列中,可能无法在内存中占用这么多数据。 在MongoDB中使用的数据是重要的数据,如果消息队列由于某种原因停机/崩溃,我们不会花费成本。 请build议。

当线程释放其资源

在pthread_detach手册页中,我读到了当任何线程被分离时,然后在线程终止的时候,它将资源释放回系统。 线程资源是什么?它是线程使用的内存的一部分,如果内存是进程地址空间的一部分的话。 我想了解这一点,但我知道了。 那么可连接线程呢,线程什么时候释放它的资源呢? 在pthread_join还是在终止或进程的时候? 在pthread_cancel命令中释放资源时。