所以,我正在实现一个包含多个线程(pthreads)的程序,我正在寻找几点帮助。我在linux上做c ++。到目前为止,谷歌已回答了我的所有其他问题,但仍有两个问题我没有找到答案。
问题1 :我将在我的线程中进行一些文件I / O和网页获取/处理。反正有没有保证线程做什么是原子的?我将让我的程序运行很长一段时间,很可能,并且它不会真正具有预定的结束点。我将从ctrl + c捕获信号,然后我想做一些清理,仍然希望我的程序打印出结果/关闭文件等。
我只是想知道程序等待线程完成是否是合理的行为,或者我是否应该杀死所有线程/关闭文件并退出。我只是不希望我的结果有所偏差。我是否可以在信号捕获方法中执行pthread_exit()?
对此的任何其他意见/想法都会很好。
问题2 :Valgrind说我有一些可能的内存泄漏。这些是可以避免的吗,或者这总是发生在c ++中的线程?下面是我用valgrind检查时得到的六条消息中的两条。
我一直在关注许多不同的网站,其中一个表示可能因为睡眠线程而导致一些可能的内存泄漏。这对我来说没有意义,但是,我正在睡觉线程来测试我现在的设置(我现在实际上并没有做任何真正的I / O,只是玩线程)。
==14072== 256 bytes in 1 blocks are still reachable in loss record 4 of 6
==14072== at 0x402732C: calloc (vg_replace_malloc.c:467)
==14072== by 0x400FDAC: _dl_check_map_versions (dl-version.c:300)
==14072== by 0x4012898: dl_open_worker (dl-open.c:269)
==14072== by 0x400E63E: _dl_catch_error (dl-error.c:178)
==14072== by 0x4172C51: do_dlopen (dl-libc.c:86)
==14072== by 0x4052D30: start_thread (pthread_create.c:304)
==14072== by 0x413A0CD: clone (clone.S:130)
==14072==
==14072== 630 bytes in 1 blocks are still reachable in loss record 5 of 6
==14072== at 0x402732C: calloc (vg_replace_malloc.c:467)
==14072== by 0x400A8AF: _dl_new_object (dl-object.c:77)
==14072== by 0x4006067: _dl_map_object_from_fd (dl-load.c:957)
==14072== by 0x4007EBC: _dl_map_object (dl-load.c:2250)
==14072== by 0x40124EF: dl_open_worker (dl-open.c:226)
==14072== by 0x400E63E: _dl_catch_error (dl-error.c:178)
==14072== by 0x4172C51: do_dlopen (dl-libc.c:86)
==14072== by 0x4052D30: start_thread (pthread_create.c:304)
==14072== by 0x413A0CD: clone (clone.S:130)
我正在创建我的主题:
rc = pthread_create(&threads[t], NULL, thread_stall, (void *)NULL);
(rc =返回代码)。在入口点的末尾,我调用pthread_exit()。
答案 0 :(得分:0)
这是我的看法:
1.如果你希望你的线程正常退出(用打开的文件或套接字句柄杀死它们绝不是一个好主意),让它们循环终止标志:
while(!stop)
{
do work
}
然后当你捕捉到ctrl-c时,将标志设置为true
,然后加入它们。确保将stop声明为std::atomic<bool>
以确保所有线程都看到更新的值。这样,他们将完成当前的一批工作,然后在下次检查条件时正常退出。
2.我没有足够的有关您的代码的信息来回答这个问题。