检测操作系统版本并相应地选择线程功能

时间:2011-06-13 16:23:04

标签: c windows runtime

是否有一种检查操作系统版本的好方法(在这种情况下是Windows Vista +),并在运行时决定将使用哪个版本的函数。

具体地说,我正在讨论在Win32线程中实现pthreads。在我的理想情况下,pthreads库将在程序启动时确定哪个OS正在运行。如果是Vista +,所有函数调用都将被重定向到酷炫的新函数和快速函数,否则将使用旧的仿真层。

因此,实际上,该库将具有每个函数的两个版本,一个是新的,一个是旧的。并且一次性运行时检查将在运行时确定,在程序进入main之前,可以说它将使用哪个版本。我知道有些库在运行时检测像SSE这样的CPU功能,并使用相关的功能,但我认为它们会检查每个函数调用。在IMO的低级线程库中,这样做太贵了。

这可能吗?函数调用可以在运行时“重新链接”/重定向,所以说吗?

编辑:像自定义crt启动代码这样的疯狂事情是可能的(我说的是mingw-w64的winpthreads,它提供了自己的启动代码)

1 个答案:

答案 0 :(得分:1)

简单的答案?为库定义和构建调度表/结构。像这样:

// Define function pointers and dispatch structure.
typedef void( *PFN_pthread_exit )( void *value_ptr );
typedef struct tag_PTHREAD_IMPL
{
    PFN_pthread_create ptr_pthread_exit;
    // Add the rest rest here.
} PTHREAD_IMPL;

// Define your various implementations dispatcher structures.
static PTHREAD_IMPL legacy_impl = { 
    &legacy_pthread_exit_impl
};
static PTHREAD_IMPL latest_andgreatest_impl = { 
    &pthread_exit_impl
};
static PTHREAD_IMPL* s_pImpl = NULL;

接下来,您的库的初始化函数应包含以下内容:

int StaticInitialize( )
{
    // Initalize dispatcher
    if( latest and greatest OS version )
        s_pImpl = &latest_andgreatest_impl
    else
        s_pImpl = &legacy_impl;
}

最后,您的库导出函数应如下所示:

int pthread_exit( void *value_ptr )
{
    ASSERT( s_pImpl );
    ASSERT( s_pImpl->ptr_pthread_exit );
    return s_pImpl->ptr_pthread_exit( value_ptr );
}

当然,您需要确保现代实现对传统平台上不存在的导出使用运行时绑定。

玩得开心!