Articles of pthreads

堆栈限制和线程之间的关系

在Linux实现(或任何操作系统)中,ulimit -s <value >与堆栈大小(在线程级别)之间的关系是什么? 是<number of threads > * <each thread stack size >必须小于< stack size assigned by ulimit command >有效alignment? 在下面的程序中 – 每个线程分配char [PTHREAD_STACK_MIN]并创build10个线程。 但是,当ulimit被设置为10 * PTHREAD_STACK_MIN时,它不会因为中止而造成内存溢出。 对于stacksize的一些随机值(远小于10 * PTHREAD_STACK_MIN),它是核心转储。 为什么这样? 我的理解是,stacksize表示由进程的所有线程总和占用的堆栈。 线程函数 #include <cstdio> #include <error.h> #include <unistd.h> #include <sys/select.h> #include <sys/time.h> #include <sys/resource.h> using namespace std; #include <pthread.h> #include <bits/local_lim.h> const unsigned […]

RedHat Enterprise Linux 5.3以上不支持sem_timedwait?

我们在RedHat Enterprise Linux系统上看到了使用pthreads sem_timedwait的奇怪行为。 只有版本5.3以上才会出现。 当我们用sem_init在后台线程上创build信号量时,不会返回任何错误。 当我们执行sem_timedwait时,我们立即返回errno = 38(ENOSYS),表示不支持。 如果我们在主线程上做同样的事情,它会按预期工作,并且sem_timedwait没有错误。 我们在RHEL 5.2或之前没有看到它。 我们试着用gcc 3.2.3和4.1.2编译我们的代码,并得到相同的结果,所以它似乎是一个运行时问题。 所以,我的问题(最后;) 1)有没有人看过这个? 2)是RHEL 5.3以上的已知问题吗? 3)我们正在使用sem_timedwait睡一个单一的线程。 在Linux上有什么替代方法可以做同样的事情? 如果这是另一个问题的重复,请告诉我。 我看了,但找不到一个相同的问题,只是类似的OSX,这不是我们正在使用的。 谢谢,pxb 更新:刚刚做了更多的testing,结果如下: 如果我在RHEL5.4盒子(使用-L / usr / lib64和-lstdc ++ -lrt)上使用gcc 4.1.2进行64位构build,并在64位安装的RHEL5上运行, 如果我在RHEL5.1盒子(使用-L / usr / lib和-lstdc ++ -lrt)上使用gcc 4.1.2来构build32位版本,并在一个完全相同的64位RHEL5盒子上运行它,我们得到ENOSYS错误sem_timedwait 所以,看起来RHEL5.4(和看似RHEL5.3)上的64位和32位运行库是有区别的。 唯一的区别是32位和64位构build分别完成了RHEL5.1和RHEL5.4盒。

gdb如何获取线程名称显示

在我的应用程序中创build了很multithreading。 一些线程名在gdb中可见,而我执行命令'info threads',其他的则不显示。 如何获取所有的线程名称本身,而不是hex值,如0xb7fe1424 4 Thread 0xb68ffb70 (LWP 18377) 0xb7fe1424 in __kernel_vsyscall () * 3 Thread 0xb7291b70 (LWP 18375) JKMainT (arg=0x0) at mylib.cpp:482 2 Thread 0xb7a92b70 (LWP 18374) 0xb7fe1424 in __kernel_vsyscall () 1 Thread 0xb7a94730 (LWP 18371) 0xb7fe1424 in __kernel_vsyscall ()

内核级线程库

我必须实现内核级线程,但在网上search时,我发现有三种方法可以在linux中创build内核级线程: NPTL KTHREAD Linux线程 这是写在linuxThreads现在被放弃的地方。 但我无法findNPTL&kthread的当前支持。 此外,我无法find任何来源,可以简单地解释我如何使用其function。 哪个是当前支持的,使用内核级线程的好库? 也请分享任何资源安装这些库,也使用它们?

等待所有线程定时器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; […]

sleep()是否干扰scanf()?

我有两个线程 xThread :连续在控制台上打印X. inputThread :从stdin获取input 当用户input“C”或“c”时停止连续打印 #include<stdio.h> #include<sys/select.h> #include<pthread.h> #define S sleep(0) int read_c = 0; pthread_mutex_t read_c_mutex = PTHREAD_MUTEX_INITIALIZER; void* inputThread_fn(void* arg) { char inputChar; while(1) { S; printf("\nChecking input"); scanf("%c",&inputChar); if(inputChar=='C' || inputChar == 'c') { pthread_mutex_trylock(&read_c_mutex); /*<–This must be _lock ? because with the use of trylock even If i don't aquire […]

为什么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; […]

保持pthreadvariables本地

在Linux GCC上使用pthread.h来保持线程函数的局部variables有一种方法: int i = 42; // global instance of i int main() { pthread_t threads[2]; long t; pthread_create(&threads[t], NULL, ThreadFunction, (void *) t; pthread_create(&threads[t], NULL, ThreadFunction2, (void *) t; } 我想知道在POSIX函数中是否有一个参数创build新的线程并保持variables是本地的: void *ThreadFunction(void *threadid) { int i=0; i++; // this is a local instance of i printf("i is %d", i); // as expected: 1 […]

并发使用多个线程写入文件

我有一个用户级别的程序,它使用标志O_WRONLY|O_SYNC打开一个文件。 该程序创build256个线程,试图将每个数据的256个或更多的字节写入文件。 我希望总共有1280000个请求,总计大约有300MB的数据。 一旦1280000个请求完成,程序结束。 我使用pthread_spin_trylock()来增加一个跟踪已完成请求数量的variables。 为了确保每个线程都写入一个唯一的偏移量,我使用pwrite()并根据已经写入的请求数来计算偏移量。 因此,在写入文件时,我不使用任何互斥锁(这种方法确保数据完整性吗?) 当我检查pwrite()调用被阻塞的平均时间和使用blktracefind的相应数字(即平均Q2C时间 – 这是BIOs整个生命周期的时间的度量)时,我发现这是有显着的差异。 实际上,给定BIO的平均完成时间远远大于pwrite()调用的平均等待时间。 这种差异背后的原因是什么? 这些数字不应该相似,因为O_SYNC确保数据在返回之前实际写入物理介质?

如何find一个pthread是否有挂起的取消请求

我想find一个线程, pthread_cancel是否被调用。 我不想使用一些表格,并保持这一点。 有没有可用的库函数? 我不想取消线程使用一些取消点function取消线程,如果有任何挂起的取消请求,我只是想知道是否有任何挂起的取消请求。