OpenSSL:从BIO_do_accept阻塞时唤醒线程

OpenSSL:从BIO_do_accept阻塞时唤醒线程,c,openssl,pthreads,blocking,C,Openssl,Pthreads,Blocking,我有一个服务器,它使用BIO_do_accept的阻塞实现接受多个客户端,每次客户端连接时,BIO_do_accept返回,我创建一个新线程来处理连接,并在主线程中再次调用BIO_do_accept以接受更多连接 但是,我需要能够停止被BIO_do_accept阻塞的线程。我想到的唯一解决方案是使用非阻塞实现,当函数返回时,检查一个全局变量以确定线程是否需要退出,如果需要,请释放内存并使用pthread_exit,如果不需要,请使用pthread_yield运行另一个线程 我不认为我可以使用信号

我有一个服务器,它使用BIO_do_accept的阻塞实现接受多个客户端,每次客户端连接时,BIO_do_accept返回,我创建一个新线程来处理连接,并在主线程中再次调用BIO_do_accept以接受更多连接

但是,我需要能够停止被BIO_do_accept阻塞的线程。我想到的唯一解决方案是使用非阻塞实现,当函数返回时,检查一个全局变量以确定线程是否需要退出,如果需要,请释放内存并使用pthread_exit,如果不需要,请使用pthread_yield运行另一个线程

我不认为我可以使用信号,因为我需要释放BIO对象,而从信号处理程序中释放内存和pthread_exit可能是不好的


有人知道更好的解决方案吗,或者全局变量/polling/pthread_exit的组合真的是最好的解决方案吗?

我不确定如何使用OpenSSL BIOs来实现这一点,但实现这一点的典型方法是使套接字不阻塞(使用
fcntl(2)
),开始异步
accept(2)
调用,然后在套接字和管道上使用
select(2)
等待
accept
完成或数据写入管道。向阻塞线程发送信号将使其从内部调用返回到
accept()
。只需确保已使用标志
SA_RESTART
安装了信号处理程序。信号接收时,
accept()
将失败,
errno
将被设置为
EINTR
。查看并设置一些“abort”标志,使BIO_do_accept()在执行任何其他操作之前总是在返回时检查,然后通过在本地TCP堆栈上打开临时客户端连接使调用返回。