如果线程正在运行阻塞代码(如accept连接),pthread_cancel是否有效?

时间:2016-03-24 07:12:19

标签: c

我是初学到C编程我创建了一个新线程并且工作正常,我的线程阻止了接受的代码。调用 pthread_cancel 从外部终止线程。或者我是否需要从外部关闭套接字

内部线程代码是阻塞代码

 while( (clientfd = accept(socketfd, (struct sockaddr *)&client,&clilen)) )
        {
                printf("New Client connected");
                ......
        }

从外部调用 pthread_cancel

pthread_cancel(thread_id);

会发生什么?

2 个答案:

答案 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));