pthread_kill不会杀死线程C linux

pthread_kill不会杀死线程C linux,c,linux,multithreading,pthreads,C,Linux,Multithreading,Pthreads,我正在做一个小项目,这将被纳入更大的项目。基本上,它所做的是跟踪通过将线程添加到主结构中而创建的线程,主结构跟踪线程所做的事情(其主函数)及其pthread_t id。另一个结构跟踪要传递给函数的数据以及pthread_t id存储在线程[]中的元素号。这是一个有点米老鼠,它跳了一点,但所有的工作,除了当它是时候杀死线程。我没有得到segfaults和错误,程序完成得很好,但是当调用pthread_kill()时,线程没有被终止(函数返回0表示没有错误,它工作了),尽管线程继续运行,直到主应用程

我正在做一个小项目,这将被纳入更大的项目。基本上,它所做的是跟踪通过将线程添加到主结构中而创建的线程,主结构跟踪线程所做的事情(其主函数)及其pthread_t id。另一个结构跟踪要传递给函数的数据以及pthread_t id存储在线程[]中的元素号。这是一个有点米老鼠,它跳了一点,但所有的工作,除了当它是时候杀死线程。我没有得到segfaults和错误,程序完成得很好,但是当调用pthread_kill()时,线程没有被终止(函数返回0表示没有错误,它工作了),尽管线程继续运行,直到主应用程序返回。

From

与kill()中一样,如果sig为零,则执行错误检查,但实际上不发送任何信号

那么下面

pthread_kill(线程[i].tID,0)

实际上不会杀死线程。您需要使用实际信号来终止线程。可在此处找到信号列表:

来自

与kill()中一样,如果sig为零,则执行错误检查,但实际上不发送任何信号

那么下面

pthread_kill(线程[i].tID,0)

实际上不会杀死线程。您需要使用实际信号来终止线程。可在此处找到信号列表:

pthread\u kill()
不会杀死线程。与
kill()
的唯一区别在于,信号由指定的线程处理,而在该线程屏蔽信号时不进行处理(请参见
pthread\u sigmask()
)。默认情况下,
SIGTERM
之类的信号仍将终止整个过程

如果您正在考虑从信号处理程序调用
pthread\u exit()
,则可能应该改用
pthread\u cancel()

如果所有可能被取消的代码协同工作(或者调用它的代码暂时禁用取消),则取消是安全的。不过,大多数图书馆并不关心这一点

一种更安全的方法是要求线程退出而不使用任何强制,例如通过向其发送特殊消息(如果线程正常处理消息)

或者,不要费心杀死任何线程,只要调用
\u exit()
\u exit()
快速退出()
pthread\u kill()
将不会杀死线程。与
kill()
的唯一区别在于,信号由指定的线程处理,而在该线程屏蔽信号时不进行处理(请参见
pthread\u sigmask()
)。默认情况下,
SIGTERM
之类的信号仍将终止整个过程

如果您正在考虑从信号处理程序调用
pthread\u exit()
,则可能应该改用
pthread\u cancel()

如果所有可能被取消的代码协同工作(或者调用它的代码暂时禁用取消),则取消是安全的。不过,大多数图书馆并不关心这一点

一种更安全的方法是要求线程退出而不使用任何强制,例如通过向其发送特殊消息(如果线程正常处理消息)


或者,不必费心杀死任何线程,只需调用
\u exit()
\u exit()
快速退出()
strace
是你的朋友。你为什么要杀死线程呢?如果线程正在执行您希望它执行的工作,那么为什么要杀死它?如果线程正在执行您不希望它执行的工作,请修复它,使其只执行您希望它执行的工作。如果线程没有工作要做,则对其进行编码,使其自行结束。我的主应用程序中的函数的编码方式是,它们将优雅地退出线程,但在某些事件中,我必须强制终止线程。
strace
是你的朋友。你为什么要杀死线程?如果线程正在执行您希望它执行的工作,那么为什么要杀死它?如果线程正在执行您不希望它执行的工作,请修复它,使其只执行您希望它执行的工作。如果线程没有工作要做,则对其进行编码,使其结束。我的主应用程序中的函数的编码方式是,它们将优雅地退出线程,但在某些事件中,我必须强制终止线程。因此,我应该向线程发送SIGKILL,使其终止?我对这些信号有点困惑,尽管发送“0”意味着退出时没有错误,或者在这些行周围有什么东西,但Sigkill将强制终止线程。您还可以考虑使用SIGTERM终止线程。有更多关于KILL和TERM之间区别的信息。信号也不能终止线程。如果它杀死任何东西,它将杀死整个进程。所以我应该将SIGKILL发送到我的线程以使其杀死?我对这些信号有点困惑,尽管发送“0”意味着退出时没有错误,或者在这些行周围有什么东西,但Sigkill将强制终止线程。您还可以考虑使用SIGTERM终止线程。有更多关于KILL和TERM之间区别的信息。信号也不能终止线程。如果它杀死任何东西,它将杀死整个进程。请注意,
pthread\u exit
不是异步信号安全的,因此从信号处理程序调用它的唯一方法是确保在调用异步信号不安全函数时阻止信号。请注意,
pthread\u exit
不是异步信号安全的,因此,从信号处理程序调用它的唯一方法是确保在调用异步信号函数时阻止信号。