我对多线程程序有问题。假设我有几个整数数组(通常为2或3),每个数组由一个单独的线程处理。我设法进行了计算,但现在我想返回在线程中创建的已处理数组。
启动线程后,启动以下循环,每0.05秒检查一次线程完成情况。这看起来挺好的。
int partsPassed = 0;
int* partsCopied;
partsCopied = (int*) malloc (numThreads * sizeof(int));
int currentCopyStatus = 0;
for (n = 0; n < numThreads; n++) {
partsCopied[n] = 0;
}
// Loop until we copy all parts of array
while (partsPassed != numThreads) {
// Loop through all parts of original array
for (n = 0; n < numThreads; n++) {
if (partsCopied[n] != 1) {
// Check for finish of computation
CmtGetThreadPoolFunctionAttribute(*threadPoolHandle, threadFunctionID[n], ATTR_TP_FUNCTION_EXECUTION_STATUS, ¤tCopyStatus);
if (currentCopyStatus == kCmtThreadFunctionComplete) { // If yes, get the array and copy to original array
CmtGetThreadPoolFunctionAttribute(*threadPoolHandle, threadFunctionID[n], ATTR_TP_FUNCTION_RETURN_VALUE, imageThreadPart[n]);
copyStaticThreadResults(imageRecPart[n]->nrRowStart, imageRecPart[n]->nrRowEnd, imageThreadPart[n]);
partsCopied[n] = 1; // Copy flag display
partsPassed++; // Count all fragments
}
}
}
Delay(0.05);
}问题是,根据文档,我只能从线程中得到任何信息。当我尝试使用以下函数时,这会导致失败--我尝试获取int** (存储在imageThreadPartn中的2D数组),该函数迫使我传递int*。
CmtGetThreadPoolFunctionAttribute(*threadPoolHandle, threadFunctionID[n], ATTR_TP_FUNCTION_RETURN_VALUE, imageThreadPart[n]);1.可以使用这个函数获得这个数组吗?
2.这可能是一个长期的尝试,但是否可以使用以下函数的回调来复制该数组,并以某种方式将线程返回的值传递给此回调?
CmtScheduleThreadPoolFunctionAdv (DEFAULT_THREAD_POOL_HANDLE,myThreadFunction,//线程函数imageRecPartn,// my data THREAD_PRIORITY_TIME_CRITICAL,copyThreadResults,//我的回调EVENT_TP_THREAD_FUNCTION_END,NULL,//回调的数据-但是如何从这里的线程传递它?!CmtGetCurrentThreadID(),&线程函数);
发布于 2015-09-05 04:53:33
所有线程共享相同的内存空间,因此可以将数组复制到共享内存中的已知位置(可能复制到传递给线程过程的位置,也可能传递给全局变量,或者复制到线程自己分配的缓冲区,并将指针传递到该缓冲区)。请注意,为了确保您对数据的更新在写入通知之前到达其他CPU核心,您需要使用一些类似于具有memory_order_release语义的原子状态变量或自旋锁。
发布于 2016-06-03 18:22:54
我一直在使用DefineThreadSafeScalarVar和DefineThreadSafeArrayVar宏来简化多线程变量的处理。也许值得做这样的事情
DefineThreadSafeArrayVar(int,partsCopied,MAX_NUM_THREADS,0);
定义数组(其中MAX_NUM_THREADS只是程序允许的最大线程数-这必须在编译时设置)
然后是GetPointerTopartsCopied()和ReleasePointerTopartsCopied()函数来处理变量访问。
https://stackoverflow.com/questions/32250575
复制相似问题