执行线程时更改C线程参数

时间:2019-05-02 22:04:25

标签: c multithreading pthreads

我需要动态更新线程函数的参数。该函数接收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条件处理器,但是我不知道在哪里发出信号,因为退出标志在主函数中(在另一个文件中)发生了变化:

#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 :(得分:0)

我认为线程将在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标志。