Зацикливание рабочих потоков без их блокировки - PullRequest
0 голосов
/ 17 мая 2018

Здравствуйте, есть ли способ запустить набор потоков (не блокируя их) и остановить, когда они сигнализируются главным потоком?

Например, в этой теме обратный вызов:

void *threadCallback ( void * threadID) {
    syncPrint("Thread %lu started . Waiting for stop signal\n", threadID);
    pthread_mutex_lock(&stopSignalGuard);
    int i = 0;
    while(!stopSignal) {
        i++;
        syncPrint("increment : %d \n",i);
        pthread_cond_wait(&stopCondition,&stopSignalGuard);
    }
    syncPrint("Stop signal received. Thread %lu will terminate...\n",(long)threadID);
    pthread_mutex_unlock(&stopSignalGuard);
    pthread_exit(NULL);
}

Из того, что я вижу, цикл while не работает эффективно. Выполнение заблокировано pthread_cond_wait (...). Можно запустить этот цикл, пока основной поток не подаст сигнал рабочим на остановку? Или это другой способ сделать это?

Спасибо!

1 Ответ

0 голосов
/ 18 мая 2018

Вам нужно использовать pthread_cond_wait(), только если поток не может прогрессировать, пока не изменилось какое-либо условие.

В вашем случае у потока, очевидно, есть другие вещи, которые он может сделать, так что вы просто проверяете флаг в секции, защищенной мьютексом, а затем продолжаете:

int getStopSignal(void)
{
    int stop;

    pthread_mutex_lock(&stopSignalGuard);
    stop = stopSignal;
    pthread_mutex_unlock(&stopSignalGuard);

    return stop;
}       

void *threadCallback (void * threadID)
{
    int i = 0;

    syncPrint("Thread %lu started . Waiting for stop signal\n", threadID);

    while(!getStopSignal()) {
        i++;
        syncPrint("increment : %d \n",i);
    }

    syncPrint("Stop signal received. Thread %lu will terminate...\n",(long)threadID);
    pthread_exit(NULL);
}
...