我是初学到C编程我创建了一个新线程并且工作正常,我的线程阻止了接受的代码。调用 pthread_cancel 从外部终止线程。或者我是否需要从外部关闭套接字。
内部线程代码是阻塞代码
while( (clientfd = accept(socketfd, (struct sockaddr *)&client,&clilen)) )
{
printf("New Client connected");
......
}
从外部调用 pthread_cancel
pthread_cancel(thread_id);
会发生什么?
答案 0 :(得分:2)
关于套接字资源,您必须手动清除它,因为线程取消不会关闭您的资源。
您可以使用cleanup_handler来查看pthread_cleanup_push() and void pthread_cleanup_pop。
一个简短的例子可能是:
void cleanup_handler(void *arg )
{
printf("cleanup \n");
// close your socket
}
void *execute_on_thread(void *arg)
{
pthread_cleanup_push(cleanup_handler, NULL);
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
while(1)
{
sleep(1);
printf("Running\n");
//thread stuff
}
pthread_cleanup_pop(1);
return (void *) 0;
}
int main( )
{
pthread_t tid;
pthread_create(&tid,NULL,execute_on_thread,NULL);
sleep(2);
if (!pthread_cancel(tid))
{
pthread_join(tid, NULL);
}
else
{
perror("pthread_cancel");
}
return 0;
}
答案 1 :(得分:1)
根据open standard 2.9.5部分线程可以在任何取消点取消。如果线程正在调用accept
函数,则会发生取消点。所以,你很高兴。
套接字不会自动关闭。只接受连接接受。请注意,该端口仍由套接字保留,因为bind
的结果未被取消。因此,您仍需要按close
关闭套接字。
默认情况下,套接字关闭后,tcp端口不会立即返回到操作系统。如果您希望套接字在关闭后立即返回端口,请在创建套接字后添加此行。
int flag = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&flag, sizeof(int));