2012-11-08 55 views
0

我开发了一个程序,它在开始时创建一个线程。然后我想在线程运行时用pthread_cancel()杀死线程。pthread_cancel()崩溃我的程序

如果我这样做,我会崩溃。这次崩溃并不总是被重现。有些时候程序避免了崩溃。

我看到一些pthread_cancel()可能导致崩溃,如果取消的线程正在运行系统调用。这是真的吗?

的dmesg显示以下错误

myprogramd[1965]: segfault at c ip b76cdef3 sp bfcd5780 error 4 in libpthread-0.9.30.1.so[b76c6000+a000] 
+1

你可以张贴一些代码? – CCoder

+0

这是很大的源代码。但我怀疑这种崩溃是一个熟悉的崩溃,并导致'pthread_cancel()'。我认为如果取消的线程正在运行系统调用,'pthread_cancel()可能会导致崩溃 – MOHAMED

+2

在调试器中运行该程序,以便可以捕获*它在哪里崩溃。这比仅仅提出随机理论要好。 – unwind

回答

0

崩溃与管理器线程有关。在第一次启动时管理器线程没有被正确地杀死,所以在第二次启动时,爬行新的线程会导致旧的线程管理器崩溃。

,请参阅以下问题了解更多详情

How to kill the management thread with C?

0

我怀疑这是一个同步的问题。我的意思是在一个不同的线程中,这个线程依赖于你正在终止的线程,你可能正在访问可能无效并导致崩溃的东西。除非你有完整的代码执行,否则我们不能指出崩溃。

至少试着在gdbget the backtrace上运行您的代码。 外观here

0

请勿使用pthread_cancel()。重构代码,以便它收到关闭的消息,不影响共享内存并使事情变得不稳定。