Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
退出包含c中阻塞语句的线程_C_Multithreading_Free_Blocking - Fatal编程技术网

退出包含c中阻塞语句的线程

退出包含c中阻塞语句的线程,c,multithreading,free,blocking,C,Multithreading,Free,Blocking,我制作了一个有多个进程的程序,每个进程都有多个线程。我想使用ctrl-c停止程序,并决定使用中断处理程序。为此,我使用signal()函数在按下ctrl-c时设置一个标志。大多数线程包含的循环中没有阻塞语句,只是在未设置标志时运行。设置该标志后,循环结束并调用pthread_exit()。一些线程包含一个阻塞语句,可能无法到达标记更改被注意到的点,循环可能结束 在下面的示例中,这将导致内存泄漏(malloc()没有free())和进程未正确结束 我检查了许多问答,但没有找到合适的解决方案。任何帮

我制作了一个有多个进程的程序,每个进程都有多个线程。我想使用ctrl-c停止程序,并决定使用中断处理程序。为此,我使用signal()函数在按下ctrl-c时设置一个标志。大多数线程包含的循环中没有阻塞语句,只是在未设置标志时运行。设置该标志后,循环结束并调用pthread_exit()。一些线程包含一个阻塞语句,可能无法到达标记更改被注意到的点,循环可能结束

在下面的示例中,这将导致内存泄漏(malloc()没有free())和进程未正确结束

我检查了许多问答,但没有找到合适的解决方案。任何帮助都将不胜感激

我在下面添加了一个示例(伪代码):


确保在所有子线程上屏蔽掉SIGINT,因为信号传递到一个没有屏蔽信号的任意线程。这保证您的“管理线程”将获得ctrl-c。然后,使用管理线程中的pthread_kill,使用无掩码信号向其他线程发送信号。这将中断阻塞调用,并允许您测试标志等

请阅读以下内容:

特别是标题为“信号掩码和待处理信号”的部分


用于检查和更改线程的信号掩码。

请确保在所有子线程上屏蔽掉SIGINT,因为信号传递到没有屏蔽信号的单个任意线程。这保证您的“管理线程”将获得ctrl-c。然后,使用管理线程中的pthread_kill,使用无掩码信号向其他线程发送信号。这将中断阻塞调用,并允许您测试标志等

请阅读以下内容:

特别是标题为“信号掩码和待处理信号”的部分

用于检查和更改线程的信号掩码

int flag = 0;

int main(void)
{
    // when (CTRL-C) is pressed, execute the interrupt handler
    signal(SIGINT, interrupt_handler_STATSERVER);

    // -- THREAD1: continuously receive packets from the data server
    pthread_t receivePackets_thread;
    int rc = pthread_create(&receivePackets_thread, NULL,(void*) receiveFromDataServer, NULL);
    if (rc)
    {
        printf("ERROR; return code from pthread_create() is %d\n", rc);
        exit(-1);
    }
}


void* receiveFromDataServer(void)
{
    while(flag == 0)
    {
        //every loop, allocate memory for a packet
        packet = (ProcessedPacket*) malloc(sizeof(ProcessedPacket));
        if(packet == NULL)
        {
            // ERROR: mem allocation error
        }
        else
        {
            // wait for a connection
            //*** THE BLOCKING STATEMENT IS HERE ***
        }       
    }

    pthread_exit(NULL);
}

void interrupt_handler_STATSERVER(int signum)
{
    printf("STAT SERVER INTERRUPT!\n");
    flag = 1;   
}`