Tag: pthreads

无法正确创建线程

谁能告诉我我做错了什么? (我省略了程序的其余部分,因为它很长……) #include void *RTPfun(char *client_addr); int main(int argc, char *argv[]) { char* client_addr; pthread_t RTPthread; // … pthread_create(&RTPthread, NULL, &RTPfun, client_addr) } void *RTPfun(char * client_addr) { // … return; } 错误: TCPserver.c:在函数’main’中: TCPserver.c:74:5:警告:从不兼容的指针类型[默认启用]传递’pthread_create’的参数3 /usr/include/pthread.h:225:12:注意:预期’void *(*)(void *)’但参数的类型为’void *(*)(char *)’

C:如何安全正确地将多个参数传递给pthread?

考虑这个简单的代码: void* threadFunction(void* arg) { int argument=(int)arg; printf(“%d recieved\n”, argument); return NULL; } int main(int argv, char* argc[]) { int error; int i=0; pthread_t thread; int argument_to_thread=0; if ((error=pthread_create(&thread, NULL, threadFunction, (void*)argument_to_thread))!=0) { printf(“Can’t create thread: [%s]\n”, strerror(error)); return 1; } pthread_join(thread, NULL); return 0; } 这有效,但这里有两件事让我烦恼。 首先,我想向threadFunction()发送多个参数。 当然,我可以传递指向数组的指针,但是如果我想传递两个不同类型的参数呢? (说一个int和char* )怎么做? 在这里困扰我的第二件事是我在编译上面时得到的警告…… test2.c: In function […]

如何从主线程唤醒睡眠线程?

我有一个捕获程序,此外捕获数据并将其写入文件还打印一些统计信息。打印统计信息的function static void report(void) { /*Print statistics*/ } 使用每秒过期的ALARM大致每秒调用一次。所以程序就像 void capture_program() { pthread_t report_thread while() { if(pthread_create(&report_thread,NULL,report,NULL)){ fprintf(stderr,”Error creating reporting thread! \n”); } /* Capturing code ————– ————– */ if(doreport) /*wakeup the sleeping thread.*/ } } void *report(void *param) { //access some register from hardware //sleep for a second } 计时器到期时设置doreport标志。如果设置了此标志,则调用report()来清除该标志。 当计时器在主线程中关闭时,如何唤醒睡眠线程(运行report())?

Pthreads的动态矩阵乘法

我是线程编程和C的初学者,我正试图弄清楚如何使用Pthreads进行简单的矩阵乘法。 我想为每个列创建一个线程,并将结果放在Result Matrix中。 我正在尝试动态地执行它,这意味着允许用户使用输入作为大小来创建两个nxn矩阵。 我的代码现在,不包括填充矩阵和读取大小n如下: #include #include #include typedef struct Matrix { int line, col, size; double (*MA)[]; double (*MB)[]; double (*MC)[]; } Matrix; void *multiply(void *arg) { Matrix* work = (Matrix*) arg; int s, z; s = work->col; z = work->line; work->MC[0][0] = 0.0.//can’t use MC, MB, MA here!! return 0; } int main() […]

如何通过引用pthread启动例程来传递顺序计数器?

下面是我的C代码,用于打印增加的全局计数器,每个线程一个增量。 #include #include static pthread_mutex_t pt_lock = PTHREAD_MUTEX_INITIALIZER; int count = 0; int *printnum(int *num) { pthread_mutex_lock(&pt_lock); printf(“thread:%d “, *num); pthread_mutex_unlock(&pt_lock); return NULL; } int main() { int i, *ret; pthread_t pta[10]; for(i = 0; i < 10; i++) { pthread_mutex_lock(&pt_lock); count++; pthread_mutex_unlock(&pt_lock); pthread_create(&pta[i], NULL, (void *(*)(void *))printnum, &count); } for(i = 0; i < […]

p编程中的pthread内存泄漏

我有下面的代码。 void *timer1_function(void * eit); pthread_t timer1; int thread_check1 = 0; line72: thread_check1 = pthread_create( &timer1, NULL, timer1_function, NULL); Valgrind显示下面的输出,并表示line 72存在问题。 上面的pthread_create用法有什么问题? 272 bytes in 1 blocks are possibly lost in loss record 2 of 5 in main in main.c:72 1: calloc in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so 2: _dl_allocate_tls in /build/buildd/eglibc-2.15/elf/dl-tls.c:297 3: pthread_create@@GLIBC_2.2.5 in /build/buildd/eglibc-2.15/nptl/allocatestack.c:571 4: main in […]

并发读者并使用pthreads在C中相互排除编写者

我希望有人能转发我或向我展示一个程序,该程序有多个读者,但相互排除C中的编写者。我在整个互联网上搜索它,并且找不到使用粗粒度锁定显示此行为的单个示例。 我知道我可以使用pthread_rwlock_init,pthread_rwlock_rdlock等,我只是不知道如何使用它。 我通过例子学习,这就是为什么我在这里。 假设我有一个代码区域(不是共享变量),我想要多个读取,但是只需要一个编写器,这就是我不知道如何使用pthreads rwlocks进行同步。 我不明白代码将如何知道现在正在编写,与现在正在阅读相比。 谢谢。

获取当前pthread cpu使用情况Mac OS X

如何在Mac OS X中从线程本身获取线程的cpu时间? 对于linux,我所做的是getrusage(RUSAGE_THREAD, &ru)但是这个解决方案不适用于Mac OS X. 我遇到了这个问题,但我不知道如何根据我的目的调整它(我不熟悉Mac OS X的内部。我甚至不确定pthread thread == mach thread)。

如何“杀死”Pthread?

我正在学习Pthreads,并想知道杀死这样一个对象的最佳方法是什么。 在寻找类似问题之后,我无法找到“明确”的答案,但请随时向我指出任何相关问题。 我正在使用一个小型客户端服务器应用程序,其中服务器主要的线程正在侦听客户端连接的套接字。 每次客户端连接时,服务器都会在while循环中创建一个执行“无限工作”的新线程。 现在我想在同一个客户端在套接字上发送“停止”请求时停止此循环。 如何通过每个套接字消息中提供的ID识别客户端,您将如何实现此类行为? 使用共享变量(在主服务器线程和客户端服务器线程之间)作为while循环中的tes条件。 使用PThreadfunction?

Pthreads无法解释的分段错误

我从Cormen着名的文本中实现了并行合并排序算法。 我使用pthreads在C中编写它,并在Win7 x64上使用MinGW编译(稍后在Ubuntu中使用GCC进行测试,结果相同)。 我在并行化方面的第一种方法是天真的……我在每个递归级别产生了一个新线程(这实际上是Cormen的伪代码所暗示的)。 然而,由于分段错误,这通常会导致太长时间或崩溃(我可以假设系统可以处理多少线程存在一些硬性限制)。 这似乎是递归并行化的常见新手错误,事实上我在这个网站上发现了类似的讨论 。 所以我改为使用该线程中的建议,即设置问题大小的阈值,并且如果生成新线程的函数被赋予小于阈值的集合(比如10,000个元素),那么它只是直接对元素进行操作,而不是为这么小的一组创建一个新线程。 现在一切似乎都运转良好。 我列出了下面的一些结果。 N是问题大小(一组整数[1,2,3,…,N]彻底加扰),阈值是我的并行排序和并行合并函数拒绝生成新线程的值。 第一个表显示以ms为单位的排序时间,第二个表显示每种情况下生成的排序/合并工作线程数。 查看下表中的N = 1E6和N = 1E7行,您可以看到,只要我降低阈值,允许超过~8000个合并工作者,我就会出现分段错误。 同样,我认为这是由于系统给予线程的一些限制,我很乐意听到更多关于这一点,但这不是我的主要问题。 主要问题是,为什么最后一行在尝试使用相当高的阈值时会出现段错误,这会产生预期的15/33工作线程(跟随前一行的模式)。 当然,这对我的系统来说并不是太multithreading。 完成的一个实例(表中右下方的单元格)使用了大约1.2GB的RAM(我的系统有6GB),并且与每行右侧的0个线程相比,线程版本似乎永远不会占用更多RAM。 我认为我没有达到任何类型的堆限制……大量的RAM可用,即使它被允许产生15/33线程也只需要~1GB。 我也不认为这是一个堆栈问题。 我设计的程序使用最小的堆栈,我不认为每个线程的占用空间都与问题大小N有关,只有堆。 我对此非常缺乏经验……但是我在gdb中做了一个核心转储堆栈回溯,堆栈顶部到底部的地址似乎足够接近以排除溢出。 我尝试在Windows中读取pthread_create的返回值…在崩溃前我得到了11次值(但它似乎没有触发崩溃,因为有几个11,然后几个0,即没有错误,然后另一个11)。 该错误代码是EAGAIN,资源不可用……但我不确定它在这里的含义。 而且,在Ubuntu中,每次出现崩溃时错误代码都是0。 我尝试了Valgrind并获得了很多关于内存泄漏的消息,但我不确定这些是否合法,因为我知道Valgrind需要额外的资源,而且我能够在没有Valgrind的情况下在其他问题集大小上获得这些类型的错误。 很明显它与问题规模和系统资源有关……我希望我缺少一些常识,这使得答案非常清楚。 有任何想法吗? 对不起文本的长墙…谢谢你,如果你已经阅读了这么远! 如果相关,我可以发布来源。 编辑:来源添加供参考: #include #include #include #include const int N = 100000000; const int SORT_THRESHOLD = 10000000; const int MERGE_THRESHOLD = 10000000; int sort_thread_count […]