Изменить параметры потока C при выполнении потока - PullRequest
0 голосов
/ 03 мая 2019

Мне нужно динамически обновить параметр функции потока.Функция получает 3 параметра:

  • Флаг выхода (int)
  • Параметр мьютекса для флага выхода
  • Структура фондового рынка

lib / concurrency_layer.c:

void * operation_executer(void *args){
   pthread_mutex_lock(&marketMutex);

   struct exec_info *execData = args;        //Parsing data from parameters
   stock_market *market = execData->market;  // Create stock market structure
   pthread_mutex_unlock(&marketMutex);

   pthread_mutex_lock(execData->exit_mutex);
   // Waits until exit flag it's 1
   while(*(execData->exit) == 0){           
        pthread_cond_wait(&exitCond, execData->exit_mutex);
   }
   pthread_mutex_unlock(execData->exit_mutex);

   pthread_mutex_lock(&marketMutex);

    struct operation op;
    while(operations_queue_empty(market->stock_operations) == 0){
            dequeue_operation(market->stock_operations, &op);
            process_operation(market, &op);
    }
    pthread_mutex_unlock(&marketMutex);
}

Я пробовал с условным выражением pthread, но я не знаю, где сделать сигнал, потому что флаг выхода изменяется в главномfunction (в другом файле):

#include "include/concurrency_layer.h";

int main(){
   exit = 0;
    exec_info info_ex1;
    info_ex1.market = &market_madrid;
    info_ex1.exit = &exit;
    info_ex1.exit_mutex = &exit_mutex;



    pthread_create(&(tid[1]), NULL, &operation_executer, (void*) &info_ex1);

    pthread_mutex_lock(&exit_mutex);
    exit = 1;
    pthread_mutex_unlock(&exit_mutex);

    pthread_join(tid[1],&res);
}

Идея состоит в том, что функция должна выполняться, когда exit=1.

Я могу добавить дополнительные глобальные переменные, функции, мьютекс, условные выражения ...в lib / concurrency_layer.h, но я не могу изменить include / concurrency_layer.h, поэтому я не могу использовать функцию для активации сигнала.

1 Ответ

0 голосов
/ 04 мая 2019

Я думаю, что поток переходит в тупиковое состояние на pthread_cond_wait() в operation_executer(), потому что вы нигде не вызываете pthread_cond_singal() в вашей программе.Если вам повезло и exit = 1; выполняется первым в main() перед while(*(execData->exit) == 0), это может сработать.

Вам необходимо внести следующие изменения.

  1. Позвоните по номеру pthread_cond_singal() из основного номера после выполнения exit = 1;, как показано ниже.

    pthread_mutex_lock(&exit_mutex); exit = 1; pthread_cond_singal(&exitCond); pthread_mutex_unlock(&exit_mutex);

  2. Вы можете изменить while(*(execData->exit) == 0) на if(*(execData->exit) == 0) в operation_executer() каквам нужно проверить флаг exit только один раз.

...