我需要动态更新线程函数的参数。该函数接收3个参数,以及:
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,因此我无法使用函数来激活信号。
答案 0 :(得分:0)
我认为线程将在pthread_cond_wait()
中operation_executer()
处进入死锁状态,因为您没有在程序中的任何地方调用pthread_cond_singal()
。如果您很幸运,并且exit = 1;
在main()
之前先在while(*(execData->exit) == 0)
中执行,则可能会起作用。
您需要进行以下更改。
按如下所示进行pthread_cond_singal()
后,从主电话呼叫exit = 1;
。
pthread_mutex_lock(&exit_mutex);
exit = 1;
pthread_cond_singal(&exitCond);
pthread_mutex_unlock(&exit_mutex);
您可以将while(*(execData->exit) == 0)
中的if(*(execData->exit) == 0)
更改为operation_executer()
,因为您只需要检查一次exit
标志。