Tag: pthreads

multithreading调试器

使用多个线程(pthreads)进行调试时,GDB存在严重问题。 在* nix上有没有其他适用于C / C ++的好的multithreading调试器?

我不能在窗口平台上使用pthread

我的env是Windows8.1(64位)并使用Visual Studio 2010。 我确实将所有* .dll文件放在system32,SYSWOW64中(因为我使用win8 64bit。) 并使用VC 2010链接x64-system的* .lib文件的位置。 当然,我添加额外的文件夹lib forders ..,包括文件夹..等.. 但是当我尝试编译“pthread-used”项目时,会发生致命错误。 -资源 #include #include int doit_id,trd_id; pthread_t trd; void *doit(void *data){ doit_id = (int)data; return 0; } int main(){ trd_id=pthread_create(&trd,NULL,doit,0); return (0); } -错误 1.obj : error LNK2019: unresolved external symbol __imp__pthread_create (referenced in function _main) C:\Users\~program Location~ : fatal error LNK1120: 1 […]

那么pthread_cond_timedwait()

void wait(int timeInMs) { struct timespec timeToWait; timeToWait.tv_sec = 5; timeToWait.tv_nsec = timeInMs*1000; int rt; pthread_mutex_lock(&fakeMutex); rt = pthread_cond_timedwait(&fakeCond, &fakeMutex, &timeToWait); pthread_mutex_unlock(&fakeMutex); } 我正在使用此代码尝试让一个线程等待一段时间,但它根本不起作用。 没有错误,它只是不会使程序执行得更慢。 我想也许每个线程都需要拥有它自己的条件和互斥量,但这对我来说真的没有意义。

了解glibc源代码约定

我一直在寻找一些glibc的源代码,特别是nptl代码,我发现它有点难以理解,因为它似乎有我不熟悉的约定。 例如,我正在查看一个非常小的文件pthread_equal.c ,有一些我有疑问的事情: 22 int 23 __pthread_equal (thread1, thread2) 24 pthread_t thread1; 25 pthread_t thread2; 26 { 27 return thread1 == thread2; 28 } 29 strong_alias (__pthread_equal, pthread_equal) 第22和23行的声明看起来像我理解的东西。 它的返回类型为int然后是函数名(thread1, thread2)和参数列表(thread1, thread2) 。 但第24行pthread_t thread1;的声明是什么pthread_t thread1; 和25 pthread_t thread2; 对于? 看起来这些被声明为全局变量,但我不明白其目的。 我在nptl目录中的许多文件中都看到了这种模式,并且无法弄清楚为什么要这样做。 什么是strong_alias ? 一个快速的谷歌搜索有使用这个的例子,但我没有找到任何文档的链接。 使用两个下划线__和一些带下划线_某些名称前缀的原因是什么。 我见过的大多数代码使用了两个下划线,但我想我已经看到了一些使用下划线的地方。 例如在pthreadP.h中 556 /* Old cleanup interfaces, still used […]

没有停止gdb中的所有线程

如果达到断点(或者在GDB shell中按下Ctrl + C),GDB通常会停止所有线程。 我知道像调度程序锁定和调度多次这样的命令存在,但我认为没有可能让一个定义的线程在后台运行而另一个调试。

为什么pthread_create()会失败,只有2个线程处于活动状态?

我在第一次尝试使用C中的线程时遇到了一些麻烦。我正在尝试(现在)编写一个非常简单的服务器程序,该程序接受套接字连接并启动一个新线程来处理它。 它似乎工作正常,除了它只会在pthread_create()失败并使用EAGAIN代码之前创建大约300个线程(303,有时是304),这意味着: “系统缺少创建另一个线程所需的资源,或者会超出系统对进程中线程总数的限制{PTHREAD_THREADS_MAX}。” 这不是 303个线程同时 – 每个线程退出,由gdb确认。 每次调用进程请求函数时,都会运行两个线程。 所以它意味着“系统缺乏必要的资源”。 我的问题是(而且可能有点愚蠢) – 这些资源是什么? 据推测,这是我程序中的内存泄漏(当然可能,甚至可能),但我认为即使如此,考虑到程序的其余部分很少,它可以管理超过300个。 我怎样才能知道我的程序可用多少内存来确认它已经用完了? 有足够的内存和交换免费,所以可能是操作系统(Linux)强加的人为限制。 谢谢

如何通过pthreads管理两个或更多的消费者?

我有一个通用的问题,我希望解决,从标准输入或常规文件流发送到应用程序的二进制数据块,然后将二进制数据转换为文本。 使用线程,我想在将文本传递给下一个应用程序之前处理文本,然后进一步修改该文本,依此类推。 作为一个简单的测试用例,我想通过gunzip提取压缩数据。 具体来说,我正在使用gunzip -c -提取通过其(重新分配的) stdin文件描述符发送给它的二进制数据块,然后从其(重新分配的) stdout文件描述符中提取出大量文本。 然后我可以将这些文本块打印到真正的stdout或stderr (或者做其他事情,稍后再做)。 (我意识到我可以在命令行上进行基于gzip的压缩和提取。我的目标是使用这个测试用例来学习如何在通过二进制文件运行数据的线程之间正确传递二进制和文本数据的通用块,或进一步处理。) 在我的测试程序中,我设置了三个pthread_t线程: produce_gzip_chunk_thread consume_gzip_chunk_thread consume_gunzip_chunk_thread 我为每个线程传递了一个名为thread_data的共享数据实例,它包含一个线程锁,两个条件,以及一些缓冲区和计数器变量。 我还为使用popen3()打开的gunzip进程popen3() : typedef struct pthread_data pthread_data_t; typedef struct popen3_desc popen3_desc_t; struct pthread_data { pthread_mutex_t in_lock; pthread_cond_t in_cond; pthread_cond_t out_cond; unsigned char in_buf[BUF_LENGTH_VALUE]; size_t n_in_bytes; size_t n_in_bytes_written_to_gunzip; size_t n_out_bytes_read_from_gunzip; FILE *in_file_ptr; boolean in_eof; char in_line[LINE_LENGTH_VALUE]; popen3_desc_t *gunzip_ptr; }; struct popen3_desc […]

静态pthreads互斥初始化

使用pthreads,如何在C中初始化一个静态的互斥量数组? 对于单个静态互斥锁,似乎我可以使用PTHREAD_MUTEX_INITIALIZER。 但是它们的静态数组呢? 例如,在 #include #define NUM_THREADS 5 / *初始化静态互斥arrays* / static pthread_mutex_t互斥锁[NUM_THREADS] = …? 或者必须动态分配?

GCC – 如何重新排列堆栈?

我尝试构建一个使用pthreads和__m128 SSE类型的应用程序。 根据GCC手册,默认堆栈对齐是16个字节。 为了使用__m128,要求是16字节对齐。 我的目标CPU支持SSE。 我使用的GCC编译器不支持运行时堆栈重组(例如-mstackrealign)。 我不能使用任何其他GCC编译器版本。 我的测试应用程序如下: #include #include void *f(void *x){ __m128 y; … } int main(void){ pthread_t p; pthread_create(&p, NULL, f, NULL); } 应用程序生成exception并退出。 经过简单的调试(printf“%p”,&y)后,我发现变量y不是16字节对齐的。 我的问题是:如何在不使用任何GCC标志和属性(它们没有帮助)的情况下正确地重新对齐堆栈(16字节)? 我应该在这个线程函数f()中使用GCC内联汇编程序吗?

我应该使用Helgrind还是DRD进行线程错误检测?

看起来Valgrind有两个工具都可以进行线程错误检测: Helgrind和DRD 。 这些工具基本相似。 我的主要问题是:我何时应该使用一个而不是另一个来检查我的multithreading代码? 更广泛地说,为什么有两种工具? 我认为它们并非完全多余。 有什么重要的区别? 我是否应该计划通过这两种工具运行我的代码?