首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C线程,CVI:如何返回线程外的数组?

C线程,CVI:如何返回线程外的数组?
EN

Stack Overflow用户
提问于 2015-08-27 13:22:08
回答 2查看 624关注 0票数 0

我对多线程程序有问题。假设我有几个整数数组(通常为2或3),每个数组由一个单独的线程处理。我设法进行了计算,但现在我想返回在线程中创建的已处理数组。

启动线程后,启动以下循环,每0.05秒检查一次线程完成情况。这看起来挺好的。

代码语言:javascript
复制
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** (存储在imageThreadPartn中的2D数组),该函数迫使我传递int*。

代码语言:javascript
复制
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(),&线程函数);

EN

回答 2

Stack Overflow用户

发布于 2015-09-05 04:53:33

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

票数 1
EN

Stack Overflow用户

发布于 2016-06-03 18:22:54

我一直在使用DefineThreadSafeScalarVar和DefineThreadSafeArrayVar宏来简化多线程变量的处理。也许值得做这样的事情

DefineThreadSafeArrayVar(int,partsCopied,MAX_NUM_THREADS,0);

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32250575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档