【发布时间】:2014-11-06 02:58:30
【问题描述】:
我有一个来自套接字的read()s 线程,我希望能够异步停止该线程。线程伪代码如下:
int needs_quit = 0;
void *thread_read(void *arg)
{
while(1)
{
if(needs_quit)
{
close(sock_fd);
return NULL;
}
int ret = read(sock_fd ...);
if(ret == EINTR) //we received an interrupt signal to stop
{
close(sock_fd);
return NULL;
}
//do stuff with read data
}
}
信号处理程序只是将needs_quit 设置为1。大多数情况下,此代码将起作用。但是,如果一个信号在if(needs_quit) 之后和read(sock_fd ...) 之前到达,那么read() 将不会被中断,线程将永远不会停止。这个问题的最佳解决方案是什么?
我应该指出,我设法用pthread_cancel 编写了一个可行的解决方案,但事实证明,由于兼容性问题,我不允许使用它。
提前感谢您的任何反馈。
【问题讨论】:
-
你用的是哪个信号?
-
带有 pthread_kill 的 SIGUSR1
-
您可以使用 poll/select/epoll 指定阻塞超时。
标签: c multithreading signals interrupt