Tag: pthreads

为什么pthread导致内存泄漏

每当我创建一个pthread时,valgrind就会输出内存泄漏, 例如下面的代码: #include #include #include void *timer1_function (void *eit){ (void) eit; printf(“hello world\n”); pthread_exit(NULL); } int main(void){ pthread_t timer1; pthread_create( &timer1, NULL, timer1_function, NULL); ///////line13 int i=0; for(i=0;i<2;i++){usleep(1);} return 0; } valgrind输出 ==1395== HEAP SUMMARY: ==1395== in use at exit: 136 bytes in 1 blocks ==1395== total heap usage: 6 allocs, 5 frees, 1,134 bytes […]

将多个参数传递给C中的线程(pthread_create)

我试图将2个无符号整数传递给C中新创建的线程(使用pthread_create())但是也没有2个整数或结构的数组似乎可以工作。 // In my socket file struct dimension { unsigned int width; unsigned int height; }; unsigned int width, height; void setUpSocket(void* dimension) { struct dimension* dim = (struct dimension*) dimension; width = dim->width; height = dim->height; printf(“\n\nWidth: %d, Height: %d\n\n”, width, height); } // In main.cpp // Pass a struct in pthread_create struct dimension […]

即使我包含正确的头文件,为什么还会出现“未定义的引用”错误?

当我尝试编译这个程序时,它失败了: #include #include #include #include void *WriteNumbers(void *threadArg) { int start, stop; start = atoi((char *)threadArg); stop = start + 10; while (start < stop) { printf("%d\n", start++); sleep(1); } return 0; } int main(int argc, char **argv) { pthread_t thread1, thread2; // create the threads and start the printing pthread_create(&thread1, NULL, WriteNumbers, (void *)argv[1] […]

将整数值转换为void *并在POSIX中再次返回是否总是安全的?

这个问题几乎与我发现的其他一些问题重复,但这个问题特别涉及POSIX,这是我在pthreads中遇到的一个非常常见的例子。 我主要关心当前的事态(即C99和POSIX.1-2008或更高版本),但任何有趣的历史信息当然也很有趣。 问题基本上归结为b是否总是采用与以下代码中的a相同的值: long int a = /* some valid value */ void *ptr = (void *)a; long int b = (long int)ptr; 我知道这通常有效,但问题是它是否是一个正确的事情(即,C99和/或POSIX标准是否保证它将起作用)。 说到C99似乎没有,我们有6.3.2.3: 5整数可以转换为任何指针类型。 除了之前指定的,结果是实现定义,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示.56) 6任何指针类型都可以转换为整数类型。 除了之前指定的,结果是实现定义。 如果结果无法以整数类型表示,则行为未定义。 结果不必在任何整数类型的值范围内。 即使使用intptr_t,标准似乎只能保证任何有效的void *都可以转换为intptr_t并再次返回,但它不能保证任何intptr_t都可以转换为void *并再次返回。 但是,POSIX标准仍然可以允许这样做。 我没有很大的愿望使用void *作为任何变量的存储空间(即使POSIX应该允许它我觉得它很难看),但我觉得我必须要问因为pthreads_create函数的常见例子使用了start_routine的参数是一个整数,它作为void *传入,并在start_routine函数中转换为int或long int。 例如, 此联机帮助页有这样的示例(请参阅完整代码的链接): //Last argument casts int to void * pthread_create(&tid[i], NULL, sleeping, (void *)SLEEP_TIME); /* … […]

易变和multithreading?

在以下代码中: #include #include #include pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int ready = 0; wait() { int i; do { usleep(1000); pthead_mutex_lock(&mutex); i = ready; pthread_mutex_unlock(&mutex); } while (i == 0); printf(“Finished\n”); } signal() { pthead_mutex_lock(&mutex); ready = 1; pthread_mutex_unlock(&mutex); } 我们生成两个线程,我们在一个线程中调用wait,然后在另一个线程中调用signal我们也让编译器积极地进行优化。 现在,代码的行为是否符合预期,或者我们是否需要使用volatile来使其工作? 不同的编译器和库会以不同的方式处理吗? 编辑:我希望互斥函数可能有一些东西会阻止自身优化,或者编译器通常不优化循环函数调用。 注意:我还没有编译和测试代码,当我有机会时会这样做。

如何从循环外部杀死无限循环中的pthread?

我创建了一个线程,并将其置于无限循环中。 使用valgrind检查代码时出现内存泄漏。 这是我的代码: #include #include void thread_do(void){ while(1){} } int main(){ pthread_t th; pthread_create(&th, NULL, (void *)thread_do, NULL); sleep(2); /* I want to kill thread here */ sleep(2); return 0; } 所以在main中创建一个线程,并且一直运行thread_do()。 有没有办法在2秒后从主内部杀死它? 我已经尝试过pthread_detach(th)和pthread_cancel(th)但我仍然会泄漏。

C编程:使用pthreads进行调试

我最初调整到的最困难的事情之一就是我第一次使用C语言编写C语言的强烈经验。我习惯于确切知道下一行代码的运行方式是什么,而且我的大多数调试技术都围绕着这种期望。 在C中用pthreads调试有哪些好的技巧? 您可以建议个人方法,无需任何添加工具,使用的工具或任何其他有助于您调试的方法。 PS我在linux中使用gcc进行C编程,但不要让它限制你的答案

具有线程的递归Fib,分段错误?

任何想法为什么它适用于0,1,2,3,4等值,并且像> 15这样的值的seg故障? #include #include #include void *fib(void *fibToFind); main(){ pthread_t mainthread; long fibToFind = 15; long finalFib; pthread_create(&mainthread,NULL,fib,(void*) fibToFind); pthread_join(mainthread,(void*)&finalFib); printf(“The number is: %d\n”,finalFib); } void *fib(void *fibToFind){ long retval; long newFibToFind = ((long)fibToFind); long returnMinusOne; long returnMinustwo; pthread_t minusone; pthread_t minustwo; if(newFibToFind == 0 || newFibToFind == 1) return newFibToFind; else{ long newFibToFind1 = […]

在pthreads中实现FIFO互斥

我正在尝试实现支持并发插入的二叉树(甚至可能在节点之间发生),但无需为每个节点分配全局锁或单独的互斥锁或互斥锁。 相反,分配的此类锁的数量应该是使用树的线程数量级 。 因此,我最终遇到了一种锁定护航问题。 更简单地解释一下,当两个或多个线程执行以下操作时, 可能会发生这种情况: 1 for(;;){ 2锁(互斥锁) 3 do_stuff 4解锁(互斥) 5} 也就是说,如果线程#1在一个“cpu突发”中执行指令4-> 5-> 1-> 2,那么线程#2将从执行中匮乏。 另一方面,如果pthreads中存在用于互斥锁的FIFO类型锁定选项,则可以避免这样的问题。 那么,有没有办法在pthreads中实现FIFO类型的互斥锁? 可以改变线程优先级吗?

multithreading程序中的意外输出

以下是使用pthreads的程序。 #include // posix threads #include #include /* to compile use -lpthread */ void * sample_thread(void *); #define MAX 10 int main() { pthread_t tid; pthread_attr_t attr; int k; pthread_attr_init(&attr); // set default attributes pthread_create(&tid, &attr, sample_thread, NULL); // create new thread // sample_thread will run as the new thread for(k=0; k<MAX; k++) { printf("Hi […]