0

我有一个多线程程序的问题。假设我有一系列的几个整数数组(通常是 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, &currentCopyStatus);
            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 。当我尝试使用以下函数时,这会导致失败 - 我尝试获取 int**(存储在 imageThreadPart[n] 中的二维数组)并且该函数强制我传递 int*。

CmtGetThreadPoolFunctionAttribute(*threadPoolHandle, threadFunctionID[n], ATTR_TP_FUNCTION_RETURN_VALUE, imageThreadPart[n]);

1、是否可以使用这个函数来获取这个数组?

2.这可能是一个长镜头,但是否可以使用以下函数的回调复制该数组并将线程返回的值直接传递给该回调?

CmtScheduleThreadPoolFunctionAdv (DEFAULT_THREAD_POOL_HANDLE, 
                                   myThreadFunction, // thread function
                                   imageRecPart[n], // my data
                                   THREAD_PRIORITY_TIME_CRITICAL, 
                                   copyThreadResults, // my callback
                                   EVENT_TP_THREAD_FUNCTION_END,
                                   NULL,  // data for callback - but how to pass it from thread here?!
                                   CmtGetCurrentThreadID(),
                                   &threadFunctionID[n]);
4

2 回答 2

1

所有线程共享相同的内存空间,因此您可以将数组复制到共享内存中的已知位置(可能是传递给线程过程的位置,可能是全局变量,可能是线程自己分配并正在传递的缓冲区一个指针)。请注意,为了确保您对数据的更新在通知已写入之前到达其他 CPU 内核,您希望使用具有memory_order_release语义的原子状态变量或自旋锁之类的东西。

于 2015-09-05T04:53:33.543 回答
0

我一直在使用 DefineThreadSafeScalarVar 和 DefineThreadSafeArrayVar 宏来简化多线程变量处理。可能值得做类似的事情

DefineThreadSafeArrayVar(int, partsCopied, MAX_NUM_THREADS, 0);

定义您的数组(其中 MAX_NUM_THREADS 只是您的程序允许的最大线程数 - 这必须在编译时设置)

然后是 GetPointerTopartsCopied() 和 ReleasePointerTopartsCopied() 函数来处理您的变量访问。

于 2016-06-03T18:22:54.667 回答