Linux Threads suspend/resume

后端 未结 9 728
情歌与酒
情歌与酒 2020-12-13 11:10

I\'m writing a code in which I have two threads running in parallel.

1st is the main thread which started the 2nd thread. 2nd thread is just a simple thread executin

9条回答
  •  猫巷女王i
    2020-12-13 11:58

    I tried suspending and resuming thread using signals, here is my solution. Please compile and link with -pthread.

    Signal SIGUSR1 suspends the thread by calling pause() and SIGUSR2 resumes the thread.

    From the man page of pause:

    pause() causes the calling process (or thread) to sleep until a signal is delivered that either terminates the process or causes the invocation of a signal-catching function.

    #include 
    #include 
    #include 
    #include 
    
    // Since I have only 2 threads so using two variables, 
    // array of bools will be more useful for `n` number of threads.
    static int is_th1_ready = 0;
    static int is_th2_ready = 0;
    
    static void cb_sig(int signal)
    {
            switch(signal) {
            case SIGUSR1:
                    pause();
                    break;
            case SIGUSR2:
                    break;
            }
    }
    
    static void *thread_job(void *t_id)
    {
            int i = 0;
            struct sigaction act;
    
            pthread_detach(pthread_self());
            sigemptyset(&act.sa_mask);
            act.sa_flags = 0;
            act.sa_handler = cb_sig;
    
            if (sigaction(SIGUSR1, &act, NULL) == -1) 
                    printf("unable to handle siguser1\n");
            if (sigaction(SIGUSR2, &act, NULL) == -1) 
                    printf("unable to handle siguser2\n");
    
            if (t_id == (void *)1)
                is_th1_ready = 1;
            if (t_id == (void *)2)
                is_th2_ready = 1;
    
            while (1) {
                    printf("thread id: %p, counter: %d\n", t_id, i++);
                    sleep(1);
            }
    
            return NULL;
    }
    
    int main()
    {
            int terminate = 0;
            int user_input;
            pthread_t thread1, thread2;
    
            pthread_create(&thread1, NULL, thread_job, (void *)1);
            // Spawned thread2 just to make sure it isn't suspended/paused 
            // when thread1 received SIGUSR1/SIGUSR2 signal
            pthread_create(&thread2, NULL, thread_job, (void *)2);
    
            while (!is_th1_ready && !is_th2_ready);
    
            while (!terminate) {
                    // to test, I am sensing signals depending on input from STDIN
                    printf("0: pause thread1, 1: resume thread1, -1: exit\n");
                    scanf("%d", &user_input);
    
                    switch(user_input) {
                    case -1: 
                            printf("terminating\n");
                            terminate = 1;
                            break;
                    case 0:
                            printf("raising SIGUSR1 to thread1\n");
                            pthread_kill(thread1, SIGUSR1);
                            break;
                    case 1:
                            printf("raising SIGUSR2 to thread1\n");
                            pthread_kill(thread1, SIGUSR2);
                            break;
                    }
            }
    
            pthread_kill(thread1, SIGKILL);
            pthread_kill(thread2, SIGKILL);
    
            return 0;
    }
    

提交回复
热议问题