Linux上的套接字问题
我有一个工作线程被accept()调用阻塞。它只是等待传入的网络连接,进行处理,然后返回以侦听下一个连接。
当需要退出程序时,如何发信号通知该网络工作线程(从主线程)从accept()调用返回,同时仍然能够正常退出其循环并处理其清理代码。
我尝试过的一些事情:
pthread_kill发送信号。感觉很笨拙,而且不能可靠地使线程执行关闭逻辑。也使程序终止。我想尽可能避免发出信号。
pthread_cancel。同上。这是对线程的残酷杀戮。那,线程可能正在做其他事情。
从主线程关闭监听套接字,以使accept()中止。这不能可靠地工作。
一些约束:
如果解决方案涉及使侦听套接字不阻塞,那很好。但是我不想接受这样的解决方案,即每隔几秒钟通过一次select调用唤醒线程以检查退出条件。
退出的线程条件可能与进程退出无关。
本质上,我要寻找的逻辑看起来像这样。
void* WorkerThread(void* args)
{
DoSomeImportantInitialization(); // initialize listen socket and some thread specific stuff
while (HasExitConditionBeenSet()==false)
{
listensize = sizeof(listenaddr);
int sock = accept(listensocket, &listenaddr, &listensize);
// check if exit condition has been set using thread safe semantics
if (HasExitConditionBeenSet())
{
break;
}
if (sock < 0)
{
printf("accept returned %d (errno==%d)\n", sock, errno);
}
else
{
HandleNewNetworkCondition(sock, &listenaddr);
}
}
DoSomeImportantCleanup(); // close listen socket, close connections, cleanup etc..
return NULL;
}
void SignalHandler(int sig)
{
printf("Caught CTRL-C\n");
}
void NotifyWorkerThreadToExit(pthread_t thread_handle)
{
// signal thread to exit
}
int main()
{
void* ptr_ret= NULL;
pthread_t workerthread_handle = 0;
pthread_create(&workerthread, NULL, WorkerThread, NULL);
signal(SIGINT, SignalHandler);
sleep((unsigned int)-1); // sleep until the user hits ctrl-c
printf("Returned from sleep call...\n");
SetThreadExitCondition(); // sets global variable with barrier that worker thread checks on
// this is the function I'm stalled on writing
NotifyWorkerThreadToExit(workerthread_handle);
// wait for thread to exit cleanly
pthread_join(workerthread_handle, &ptr_ret);
DoProcessCleanupStuff();
}
HUH函数
三国纷争
MMMHUHU