c++ - 从 WinAPI 线程调用 omp_set_num_threads 时出现问题

标签 c++ c visual-studio-2008 winapi openmp

我在 MSVC 9 SP1 下使用 OpenMP v2 时遇到了一个有趣的问题。调用omp_set_num_threads时从执行的主线程然后使用 omp_get_num_threads检查设置的金额,一切正常并结账。

但是,在 GUI 应用程序中,我调用相同的东西,但它自己的线程(使用 CreateThread 创建),以防止 UI 变得无响应,无论如何看起来 omp_set_num_threads从线程调用时不起作用,如 omp_get_num_threads总是报告 1,并且从测试中我只能看到一个线程在运行。

总结:omp_set_num_threads从不是进程主线程的线程调用时有问题/限制吗?

代码:

void CalculateDivisionSeriesOMP(unsigned long dwMul, int nType, size_t nOMPThreads)
{
    omp_set_num_threads(nOMPThreads);
    if(nType == 0)
    {
        #pragma omp parallel default(shared)
        {
            #pragma omp master
            {
                Printf("Starting Search For Divisor With Constant: 0x%08X...",dwMul);
                Printf("%d Threads In Use",omp_get_num_threads());
            }

            #pragma omp for
            for(__int64 i = 2; i < 4294967295; i++)
            {
                mu U = magicu2(i);
                if(U.M == dwMul)
                    Printf("Found Unsigned Divisor: %d Series Expansion Stage(Shift): %d Add: %d",unsigned long(i),U.s,U.a);

                ms S = magic(i);
                if(S.M == dwMul)
                    Printf("Found Signed Divisor: %d Series Expansion Stage(Shift): %d",i,S.s);
            }
        }

    }
//more of the same...
}

DWORD WINAPI DivThread(void* p)
{
    //...
    CalculateDivisionSeriesOMP(dwMul,nType,nOMPThreads);
    //...
}

//...
hDivThread = CreateThread(NULL,0,DivThread,NULL,0,NULL);
//..

最佳答案

使用了哪些编译器选项(openmp)?请检查函数中的这段代码:

#ifndef _OPENMP
printf("No OpenMP.");
#else
printf("OpenMP OK.");
#endif

关于c++ - 从 WinAPI 线程调用 omp_set_num_threads 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3888734/

相关文章:

c++ - 继承接口(interface)实现

c - 为什么这会产生段错误?

聊天服务器和客户端实现?

visual-studio-2008 - 如何为 Visual Studio 2008 设置默认的源代码管理插件?

sql-server-2008 - 无法将类型 'System.__ComObject' 的 COM 对象转换为接口(interface)类型 'Microsoft.VisualStudio.OLE.Interop.IServiceProvider'

c++ - DLL的公共(public)只读存储器

c++ - 共享内存中的 std::string 数组。

c++ - 如何让QScrollArea根据QDialog改变大小?

C 头文件导致警告 "ISO C requires a translation unit to contain at least one declaration"

asp.net - 从命令行复制 VS2008 "Publish Web Site"