Articles of pthreads

pthread_join(thread_id,&res),如果&res不是NULL – 是免费的(res)需要?

我在这里偶然发现了一个代码示例。 引起我注意的线条(跳过所有其他线条): { … void *res; … s = pthread_join(tinfo[tnum].thread_id, &res); … free(res); /* Free memory allocated by thread */ } 任何人比我更深入pthreads评论free(res) ,请? 我不得不说,我以前从来没有见过这样的事情,而使用Googlesearch1-1.5小时并没有给我任何其他类似的例子。

sched_getcpu()在Linux上可靠吗?

我试图debuggingLinux上的pthreads的一些性能问题,我认为sched_getcpu()可能是骗我。 它会为每个线程报告一个固定的CPU,而分析实验似乎表明这些线程实际上正在从一个核心迁移到另一个核心。 我不知道是否sched_cpu()只报告线程开始运行的第一个CPU,并且不知道线程迁移? 有没有其他人注意到这一点,或看到任何证据sched_getcpu()的返回值可能会改变? 如果它不可靠,有没有其他方法来跟踪当前的CPU(使用CPUID也许?)?

使用pthread_join时出现分段错误(退出代码139)

我在Linux系统上使用线程做了一些第一步,而且我有一个程序的基础上发生了这个错误,该程序获得了n参数并创build了n个线程。 这是代码的重要部分: 线程应该运行的函数: void* function(void* arg){ int id = (long)arg; printf("Thread #%ld created!\n",id); pthread_exit(0); } main函数中代码的重要部分 int main(int argc, char **argv){ if(argc != 3){ printf("Usage: %s <num> <exp>\n",argv[0]); exit(-1); } int num = atoi(argv[1]), exp = atoi(argv[2]); long i; pthread_t threads[num]; pthread_attr_t attr; printf("Creating %d threads \n",num); pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE); for (i = 0; i < […]

有没有办法链接一个Linux的线程TID和一个pthread_t“线程ID”

在Linux上,线程由pthread_t或TID标识。 我正在寻找这两种线程ID之间的桥梁: 给一个pthread_t我可以得到它的TID ? 显然不是没有黑客pthread的内部:(但我仍然要求,以防万一有一个干净的方式来做到这一点。 给定一个TID (或PID ),我可以得到一个pthread_t句柄吗? 因为术语“线程ID”在这个上下文(以及在文档中)是不明确的,所以有一些背景: POSIX pthread API定义了一个pthread_ttypes,查询/作用于线程的所有函数都使用pthread_t参数,我们可以通过pthread_self()来获得这样的句柄。 文档调用这些“线程ID”,但在这里我称它们为消除歧义的句柄,因为多个不同的pthread_t值可能表示相同的线程,因此需要pthread_equal(pthread_t, pthread_t) 。 另一方面,在Linux上至less有一个TID或线程标识的概念。 可以通过系统调用获得当前的TID : syscall(SYS_gettid) 。 TID有一些有趣的属性,例如对于一个线程来说是唯一的,并且可以与PID相媲美,这允许容易地识别主线程等。

子线程退出时如何通知父线程

有人可以帮助我理解在子线程退出之后唤醒主线程的情况吗? 我的理解是,join调用futex_wait,导致主线程等待,直到子线程完成。 大概有一个futex_wake调用,以允许主线程恢复,但在两个线程运行strace后,我不能看到系统调用唤醒父线程的位置。 #include <iostream> #include <thread> #include <string> void hello() { std::cout <<"Hello Concurrent World" << std::endl; } int main () { std::thread t(hello); t.join(); std::cout << "finished" << std::endl; } 从父线程strace 19:37:06.206727 brk(NULL) = 0x1380000 19:37:06.206804 brk(0x13b2000) = 0x13b2000 19:37:06.206968 futex(0x7fcf7953005c, FUTEX_WAKE_PRIVATE, 2147483647) = 0 19:37:06.207331 futex(0x7fcf79530068, FUTEX_WAKE_PRIVATE, 2147483647) = 0 19:37:06.207577 mmap(NULL, […]

C + + 11:是Linux上的std ::线程取决于pthread库?

我读到pthread是C库,并且与C ++对象模型不兼容,特别是在讨论exception处理时。 所以我想在linux系统上知道gcc / clang是如何实现std::thread ,它是调用一些linux本地函数/内核apis还是什么的? 另外,如何实现与__thread相关的std::thread_local ?

什么使pthread失效?

我正在使用当前创build后台线程(PTHREAD_DETACHED)的multithreading程序(使用pthreads),然后调用pthread_exit(0)。 我的问题是,这个过程被列为“已经停止”,好奇地似乎并没有真正存在于/ proc(这打败了我的debugging策略) 我想要满足以下要求: 程序应该在循环中运行函数A并且运行一次函数B. 给定程序的PID / proc / $ pid / exe,/ proc / $ pid / maps和/ proc / $ pid / fd必须是可访问的(当进程停止时,它们全是空的或无效的链接) 必须像平常一样用CTRL + C和CTRL + Z暂停/中断程序 编辑:我犹豫不决改变程序的接口为“主”线程中的A和B产生的线程(他们目前在另一种方式)。 它会解决问题吗?

当一个pthread退出时如何保持进程退出?

我正在用C编写一个服务器程序,每次客户端连接时,我都会创build一个新的pthread来处理客户端的请求。 然而,当所有的线程退出时,我的程序退出,就好像调用了exit()一样。 这是一个问题 – 我该如何克服它? 可以说服务器正在运行,并且有2个客户端连接。 一旦这些客户端断开连接,并因此两个线程退出 – 然后我的服务器进程退出。 我想要的是我的服务器保持接受套接字请求。 通常情况下,当我使用fork()和accept()时,这是有效的。 我在做什么错误,使父进程终止,而不是循环无限? 代码看起来基本如此: void *talker( void *d ) { int fd; char buf[] = "Hello client"; fd = (int)d; while( 1 ) { write( fd, buf, strlen( buf )+1 ); sleep(4); } } int main( int argc, char *argv[] ) { pthread_t thread[50]; int sockfd; […]

在libpthread链接应用程序中捕获exception时发生分段错误(linux,C ++)

我在这里有这段代码: 这些是用来创build和停止pthread的函数: void WatchdogController::conscious_process_handler_start() { if ( debug ) cout << "WatchdogController: starting conscious process thread" << endl; cn_pr_thread_active = true; if ( pthread_create( &cn_pr_thread, NULL, conscious_process_handler, this ) < 0 ) { cn_pr_thread_active = false; throw WatchdogException( "Unable to start new thread" ); } } void WatchdogController::conscious_process_handler_stop() { if ( debug ) cout << […]

gdb backtrace和pthread_cond_wait()

这是使用gcc 4.1.2和gdb 7.0的Redhat EL5机器,配有2.6.18-164.2.1.el5 x86_64内核。 当我使用gdb运行我的应用程序,并在运行时中断它的时候,我的一些线程显示下面的调用堆栈,当我做一个回溯: #0 0x000000000051d7da in pthread_cond_wait () #1 0x0000000100000000 in ?? () #2 0x0000000000c1c3b0 in ?? () #3 0x0000000000c1c448 in ?? () #4 0x00000000000007dd in ?? () #5 0x000000000051d630 in ?? () #6 0x00007fffffffdc90 in ?? () #7 0x000000003b1ae84b in ?? () #8 0x00007fffffffdd50 in ?? () #9 0x0000000000000000 in ?? […]