为了账号安全,请及时绑定邮箱和手机立即绑定

为什么传进去的变量算得到的结果被赋给其他变量了

为什么传进去的变量算得到的结果被赋给其他变量了

Helenr 2023-03-03 22:18:53
问题描述:有80个计算状态(popsize = 80),现在计划用10核计算(建立10个线程nThreadCount = 10),由于每个状态的计算时间不同(不可预测,大概在15分钟以内),为了节省计算时间,计划一个线程的计算状态完成后,紧跟着将紧跟着的下一个计算状态调入计算(不关闭线程),但是计算结果发现:传进评估函数(test_problem函数)的计算结果与变量不对应,即传进去的变量算得到的结果被赋给其他变量了。郁闷!求高手帮忙!//线程建立函数void create_proc(population *pop){int i;HANDLE* threads = new HANDLE[nThreadCount]; // 线程句柄,nThreadCount = 10thread_pos = 0;hMutex = CreateMutex(NULL,FALSE,NULL); // 建立互斥对象for (i = 0; i < nThreadCount; i++){threads[i] = CreateThread( NULL, 0, TaskThreadProc, pop, 0, NULL); // 创建线程thread_pop_pos[i] = 0;SetThreadAffinityMask(threads[i], 1<<i); //分配核计算if (threads[i] == NULL)  {  printf("\n thread %d have not been created sucessfully, hence exiting", i);system("pause");exit(1);  }  SuspendThread(threads[i]);}for(i = 0; i <nThreadCount; i++){ResumeThread(threads[i]);Sleep(1000);}WaitForMultipleObjects(nThreadCount, threads, TRUE, INFINITE); // 等待线程运行结束for (i = 0; i < nThreadCount; i++)CloseHandle(threads[i]); // 销毁线程delete [] threads;}// 线程函数DWORD WINAPI TaskThreadProc( LPVOID lpParameter ){population *pop = (population *) lpParameter; //pop 包括所有的计算状态evaluate_pop (pop);return 0;}// 这个函数要评估所有的80个状态void evaluate_pop (population *pop){int ind_count; //每个线程正在评估的个体do{ ind_count = thread_pos; // 将全局赋给局部变量evaluate_ind (&(pop->ind[ind_count])); // 调用单个状态评估函数}while(thread_pos < popsize);return;}void evaluate_ind (individual *ind){int j;WaitForSingleObject(hMutex,INFINITE);thread_pos++; // 全局变量,当前共评估到那个状态ReleaseMutex(hMutex);// ind->xreal 变量共10个DOUBLE型数据,ind->obj要得到的变量值,共2个// test_problem里面调用了一个DLLtest_problem (ind->xreal, ind->obj);  return;}高手帮忙解答,感谢不尽,在线等,有疑问请回复
查看完整描述

2 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

自己安排线程太累了。
用OMP吧。
#pragma omp parallel for
超级简单。VS2005以后就有了。
不学就落伍啦。

查看完整回答
反对 回复 2023-03-06
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

malloc一份新的的参数pop参数传到TaskThreadProc这个里面

查看完整回答
反对 回复 2023-03-06
  • 2 回答
  • 0 关注
  • 69 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信