Articles of multithreading

等待所有线程定时器callback完成的安全方法

在一次性定时器的情况下,我可以使用信号量等待定时器callback完成。 但是,如果定时器被多次发射,这并没有帮助。 考虑下面的代码: #include <stdlib.h> #include <stdint.h> #include <stdio.h> #include <signal.h> #include <time.h> #include <unistd.h> #include <pthread.h> #define N 10 void timer_threaded_function(sigval_t si) { uint8_t *shared_resource = si.sival_ptr; sleep(rand() % 7); /* … manipulate with shared_resource */ return; } int main() { struct sigevent sig_ev = {0}; uint8_t *shared_resource = malloc(123); timer_t timer_id; int i; […]

如何debuggingstrace中显示的futex争用?

我在multithreading的linux进程中debugging一个问题,其中某个线程似乎不会执行几秒钟。 看strace输出显示它等待futex例如 1673109 14:36:28.600329 futex(0x44b8d20,FUTEX_WAIT_PRIVATE, 1673109 14:36:33.221850 <… futex恢复>)= 0 <4.621514> 我怎样才能找出这futex(0x44b8d20)在用户空间引用,即如何映射到一个locking使用futex内部结构。

用原始进程名称生成核心文件

我有一个二进制,将创build多个线程。 现在,当其中一个线程崩溃时,我想要生成的核心文件的名称包含原始进程名称而不是线程名称。 当我使用%e说明符时,它只给出线程名称(我认为这是因为在Linux中,所有线程都被视为LWP)。 如何获得在核心文件名中创build线程的原始进程? 我看了man文件 ,但没有任何其他说明符可以使用。

如果我fork()然后做一个execv(),谁拥有控制台?

我正在编写一个Linux应用程序。 如果我调用fork() ,然后运行一个需要控制台input的应用程序,会发生什么? 考虑下面的代码: int process_id = fork(); if (process_id != 0) { /* this is the parent process */ error = execv("../my_other_app", "parameter1", NULL); if (error < 0) { printf("error!"); } } else { /* this is the child process. Wait for my_other_app to set up */ sleep(3); /* now continue */ } printf("########## […]

python的fcntl.flock函数是否提供文件访问的线程级locking?

Python的fcnt模块提供了一个名为[flock] [1]的方法来certificate文件locking。 它的描述如下: 对文件描述符fd执行锁操作op(也接受提供fileno()方法的文件对象)。 有关详细信息,请参阅Unix手册(2)。 (在某些系统上,这个函数是用fcntl()模拟的。) 查看flock的linux手册页,只涉及到跨进程locking,例如: 对flock()的调用可能会阻止另一个进程持有不兼容的锁。 要做出一个非阻塞的请求,包括LOCK_NB(ORing)与上述任何操作。 所以我的问题是:将flock()还提供线程安全locking和locking同一进程内的多个线程以及来自不同进程的线程? [1]: http : //docs.python.org/library/fcntl.html#fcntl.flockfunction是使用fcntl()模拟的。)

为什么ostringstream在multithreading环境下无法正常工作

也许有些奇怪。 当我在我的multithreading环境中使用STL ostringstream类时,我发现每个线程的执行时间随着线程数的增加而线性增加。 我不知道为什么发生这种情况。 我尝试检查ostringstream源代码,但无法find任何同步代码。 在ostringsstream中有没有同步的地方? 我用snprintfreplaceostringsstream,性能大幅提高。 我的操作系统是RHEL5.4 64BIT,我的服务器上有两个至强5620 CPU。 以下是运行结果我分别使用1和8个线程1000000个循环。 左列是threadid,右边是运行时间。 因此,随着线程数量的增加,每个线程的运行时间也随之增加。 [host]$./multi_thread 1 1000000 1115760960:0.240113 [host]$./multi_thread 8 1000000 1105004864:8.17012 1115494720:8.22645 1125984576:8.22931 1136474432:8.41319 1094252864:8.73788 1167944000:8.74504 1157454144:8.74951 1146964288:8.75174 代码列表如下 #include <iostream> #include <sstream> using namespace std; void * func(void * t) { int n = *((int *) t); pthread_t pid = pthread_self(); timeval t1, t2; […]

linux – 在几个核心上运行进程

我对核心,进程和线程的工作原理有一个误解: 进程有多个线程。 所有这些线程共享相同的内存部分 核心有它自己的caching和内存地址空间。 所以,当我在Linux操作系统上运行一个进程(包含多个线程),并检查“top -H”命令时,可以看到线程分布在多个内核上。 那么它如何工作? (同一进程的线程,共享相同的进程地址空间,在不同的核心上运行?)? 我在这里想念什么? 谢谢

哪些操作系统/平台实现等待变形优化?

哪个主要的操作系统/平台实现等待变形? 这个问题出现时,我发现没有明确的最佳做法是否应该通过locking互斥信号发出一个条件variables。 一个典型的build议是在locking的时候发出信号,除非分析显示从解锁(通过移除额外的上下文切换)显着地改善了性能。 IIUC,在信令是额外的两个上下文切换时保持锁的唯一缺点; 优点是错误的风险较低,并且更容易实现实时的可预测性。 所以,如果实施等待变形,那么在信号传输的情况下保持locking的做法是非常好的。

Python,gevent,urllib2.urlopen.read(),下载加速器

我正在尝试为Linux构build一个下载加速器。 我的程序使用gevent,os和urllib2。 我的程序收到一个URL并尝试同时下载文件。 我所有的代码都是有效的。 我唯一的问题是,urllib2.urlopen.read()阻止我同时运行.read()函数。 这是抛出我的例外。 Traceback (most recent call last): File "/usr/lib/pymodules/python2.7/gevent/greenlet.py", line 405, in run result = self._run(*self.args, **self.kwargs) File "gevent_concurrent_downloader.py", line 94, in childTasklet _tempRead = handle.read(divisor) # Read/Download part File "/usr/lib/python2.7/socket.py", line 380, in read data = self._sock.recv(left) File "/usr/lib/python2.7/httplib.py", line 561, in read s = self.fp.read(amt) File "/usr/lib/python2.7/socket.py", line 380, […]

如何在连接期间replacepthread_create

我想维护所有正在运行的线程的列表,并提供关于每个线程的一些附加信息。 在这个答案中提到,可以提供我自己的pthread_create版本,并将其链接到程序。 我想在我的覆盖版本的末尾调用原始的pthread_create也是很重要的。 有人可以详细解释如何做和/或提供一些代码示例?