Как приостановить и возобновить поток? - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь написать программу, которая остановит и продолжит поток вместо того, чтобы отменить его.Мне нужно знать, как мне этого добиться?

Я хочу использовать функцию pthread_kill () с сигналами SIGSTOP и SIGCONT для потоков.

#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <time.h>



void *threadfunc(){
        while(1){
            printf("i am thread \n");
            sleep(1);
        }
}

void main(){
    pthread_t thread;
    pthread_create(&thread, NULL, threadfunc, NULL);
    sleep(2);
    pthread_kill(thread, SIGSTOP);
    printf("signal sent \n");
    sleep(2);
    printf("i am main thread \n");
}

Мои ожидания: запуск программы 2 раза«Я - нить» напечатано, pthread_kill отправил сигнал на остановку нити, пользователь видит «сигнал отправлен» и «Я - основная нить».Фактические результаты: программы запускаются, 2 раза печатается «я нить», pthread_kill посылает сигнал остановки и программа завершается

1 Ответ

0 голосов
/ 15 февраля 2019

Не существует единственного правильного способа приостановить и возобновить поток.

Во-первых, нет никакого способа сделать это без взаимодействия с кодом, выполняемым потоком.В противном случае может произойти сбой, если вы приостановите поток, в то время как он удерживает блокировку, которую поток, который должен возобновить, должен получить, прежде чем он сможет возобновить.Таким образом, вы должны иметь код, который выполняет поток, который вы хотите приостановить.

С помощью потока вы можете делать это так, как вам нравится.У вас может быть атомарный тип, который поток периодически проверяет.Вы можете просто не дать нити работать, если она предназначена для приостановки, когда у нее нет работы.

Нет единственно верного пути, и это полностью зависит от других дизайнерских решений.Прежде всего, это зависит от того, что делает этот код, и почему вы хотите приостановить его.

Еще одна вещь, которая чрезвычайно важна: всякий раз, когда вы чувствуете, что вам нужно проникнуть в поток извне и заставить его сделать илине делать что-то, это должно быть знаком для вас, что вы изначально неправильно написали нить.Поток должен знать, какую работу он должен выполнять и когда он должен не выполнять работу по собственному проекту.Если что-то еще должно «проникнуть» навязчиво и заставить это делать или не делать вещи, вам следует пересмотреть проектные решения, которые привели вас к этой точке.

И к вашей конкретной точке:

Я хочу использовать функцию pthread_kill () с сигналами SIGSTOP и SIGCONT для потоков.

Это не может работать.Что делать, если поток удерживает внутреннюю блокировку библиотеки, которую необходимо получить для возврата из pthread_kill?Поток, пытающийся приостановить его, также приостановит сам себя.В любом случае SIGSTOP определяется как остановка процесса , а не потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...