Tag: pthreads

pthread_cond_wait:随机分段错误

更新3 最近,我注意到我的代码随机导致Segmentation Fault错误。 但我认为到目前为止我的代码非常简单,我无法弄清楚错误的来源。 由于它是随机发生的,我认为存在某种竞争条件。 我认为这是可能相关的所有代码,如果您需要更多,请告诉我: namespace thread { pthread_t terminated_thread_id, /* and others */; pthread_mutex_t terminate_thread = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t terminate_thread_signal = PTHREAD_COND_INITIALIZER; int total_thread_count = 0; int termination; // + sembufs inline void* Exit(void* value) { // This must be unlocked after all join-related jobs are done semop(thread::termination, thread::termination_in_process, 2) pthread_mutex_lock(&thread::terminate_thread); thread::terminated_thread_id = pthread_self(); […]

POSIX pthread编程

我必须编写一个multithreading(比如两个线程)程序,其中每个线程执行不同的任务。 此外,这些线程一旦启动就必须在后台无限运行。 这就是我所做的。 有人可以给我一些反馈,如果方法是好的,如果你看到一些问题。 另外,我想知道如果用Ctrl + C终止执行,如何以系统的方式关闭线程。 main函数创建两个线程,让它们无限运行,如下所示。 这是骨架: void *func1(); void *func2(); int main(int argc, char *argv[]) { pthread_t th1,th2; pthread_create(&th1, NULL, func1, NULL); pthread_create(&th2, NULL, func2, NULL); fflush (stdout); for(;;){ } exit(0); //never reached } void *func1() { while(1){ //do something } } void *func2() { while(1){ //do something } } 谢谢。 使用答案中的输入编辑代码:我是否正确退出线程? […]

信号处理程序中的pthread_exit()

(这个问题可能与信号处理程序中的pthread_exit有些相关导致分段错误 )我正在编写一个引导锁定防止库,其中总是有一个检查线程正在执行图形内容并检查是否存在死锁,如果有,则它会发出其中一个信号冲突的线程。 当该线程捕获信号时,它释放它拥有并退出的所有互斥锁。 有多个资源互斥(显然)和一个关键区域互斥,所有获取,释放资源锁定和执行图形计算的调用必须首先获得此锁定。 现在出现了问题。 使用2个竞争(不计入检查线程)线程, 有时程序在一个线程被杀死后死锁。 在gdb中,它说死线程拥有关键区域锁定但从未释放它。 在信号处理程序中添加断点并单步执行后, 在pthread_exit()之前看起来锁属于其他人(正如预期的那样),但是在pthread_exit()之后,所有权神奇地转到了这个线程。 我能想到的唯一猜测是,当试图获得关键区域锁定时,被杀死的线程在pthread_mutex_lock处阻塞(因为它需要另一个资源互斥锁),然后信号来了,中断了pthread_mutex_lock。 由于这个电话不是信号防范的,所以发生了一些奇怪的事情? 就像信号处理程序可能已经返回并且该线程获得锁定然后退出? Idk ..感谢任何见解!

Eclipse Juno – GCC编译器pthread

所以我目前正在大学的实际课程中,没有一个人可以弄清楚如何在Eclipse中添加pthread库。 这是我第一次使用Eclipse。 我正在使用Fedora,当我转到Properties-> C / C ++ Build-> Settings时,我得到的只是配置的下拉列表而不是其他内容 – 没有用于添加它的工具的选项卡。 谁能帮我? 谢谢!

pthread_create内存泄漏?

每当我在我的程序上运行valgrind时,它告诉我,无论我在哪里调用pthread_create,我都可能丢失内存。 我一直在努力遵循指导 使用pthread_create时valgrind内存泄漏错误 http://gelorakan.wordpress.com/2007/11/26/pthead_create-valgrind-memory-leak-solved/ 和谷歌给我的其他各种网站,但没有任何效果。 到目前为止,我已尝试加入线程,将pthread_attr_t设置为DETACHED,在每个线程上调用pthread_detach,并调用pthread_exit()。 尝试PTHREAD_CREATE_DETACHED – pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&c_udp_comm, &attr, udp_comm_thread, (void*)this); pthread_create(&drive, &attr, driving_thread, (void*)this); pthread_create(&update, &attr, update_server_thread(void*)this); 我想我可能已经编写了下一个加入错误的代码…我将通过https://computing.llnl.gov/tutorials/pthreads/进行编码,他们将所有线程都放在一个数组中,这样它们只是用于循环。 但我没有将它们全部放在一个数组中,所以我试着将它改成工作。 请告诉我,如果我做错了。 void* status; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_create(&c_udp_comm, &attr, udp_comm_thread, (void*)this); pthread_create(&drive, &attr, driving_thread, (void*)this); pthread_create(&update, &attr, update_server_thread(void*)this); pthread_join(c_udp_comm, &status); pthread_join(drive, &status); pthread_join(update, &status); 尝试pthread_detach – pthread_create(&c_udp_comm, NULL, […]

用pthreads泄漏内存

我正在使用pthreads并根据valgrind我泄漏内存,就像使用pthread_create时valgrind内存泄漏错误一样 最好的答案是,如果你pthread_join所有的线程,这个内存将被回收,但它不适合我。 pthread_t threads[NUM_THREADS]; … for (i = 0; i < NUM_THREADS; i++) { pthread_create(&threads[i], &attr, Worker, NULL); } … for (i = 0; i < NUM_THREADS; i++) { pthread_join(threads[i], NULL); } valgrind输出 ==2707== HEAP SUMMARY: ==2707== in use at exit: 954 bytes in 4 blocks ==2707== total heap usage: 7,717 allocs, 7,713 frees, 79,563 […]

如何将多个值作为参数传递给C中的线程?

在C中,我如何将多个参数传递给线程? 通常情况下,我是这样做的, pthread_create(&th,NULL,dosomething,(void*)connfd); void * dosomething(void *connfd) { // Doing something } 在上面的例子中,我只将connfd值传递给线程’th’。 有没有办法传递多个值,以便它对我有用? 还有一件事,我们可以将数组作为参数传递给线程吗?

Linux / POSIX等效于Win32的CreateEvent,SetEvent,WaitForSingleObject

我写了一个小类来同步Linux(实际上是Android)和Windows的线程。 这是我的界面的Win32实现: class SyncObjectWin32 : public SyncObject { private: const HANDLE m_hEvent; public: SyncObjectWin32() : m_hEvent( ::CreateEvent( NULL, FALSE, FALSE ) ) { if( NULL == m_hEvent ) throw core::Exception( “sys::SyncObjectWin32::SyncObjectWin32() – Failed to create event.” ); } ~SyncObjectWin32() { ::CloseHandle( m_hEvent ); } void WaitForSignal() { ::WaitForSingleObject( m_hEvent ); } void Signal() { ::SetEvent( […]

c将几个参数传递给线程

当我创建一个线程时,我想传递几个参数。 所以我在头文件中定义以下内容: struct data{ char *palabra; char *directorio; FILE *fd; DIR *diro; struct dirent *strdir; }; 在.c文件中,我执行以下操作 if (pthread_create ( &thread_id[i], NULL, &hilos_hijos, ??? ) != 0){ perror(“Error al crear el hilo. \n”); exit(EXIT_FAILURE); } 我如何将所有这些参数传递给线程。 我虽然说: 1)首先使用malloc为此结构分配内存,然后为每个参数赋值: struct data *info info = malloc(sizeof(struct data)); info->palabra = …; 2)定义 struct data info info.palabra = … […]

为什么pthread_join()的第二个参数是**,指向指针的指针?

我是使用pthread新手,也不熟悉指针指针。 有人可能会解释为什么pthread_join()的第二个参数是一个void ** 。 为什么这样设计。 int pthread_join(pthread_t thread, void **value_ptr);