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

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

| 有没有什么好方法可以检查OS版本(在这种情况下是否为Windows Vista +),并在运行时确定要使用的功能版本。 具体来说,我正在谈论在Win32线程中实现pthread。在我的理想情况下,pthreads库将在程序启动时确定运行哪个OS。如果是Vista +,则所有函数调用都将重定向到凉爽的新函数和快速函数,否则,将使用旧的仿真层。 因此实际上,该库将为每个函数提供两个版本,一个是新版本,一个是旧版本。一次运行时检查将确定在运行时,程序进入main之前,可以使用哪个版本。我知道有一些库可以在运行时检测CPU功能(例如SSE)并使用相关功能,但是我认为它们会在每个函数调用时进行检查。在低级线程库IMO中这样做太昂贵了。 这可能吗?可以在运行时“重新链接” /重定向函数调用吗? 编辑:诸如自定义crt启动代码之类的疯狂事情将对此可行(我在谈论mingw-w64的winpthreads,它提供了自己的启动代码)     

解决方法

        简单的答案?为您的库定义并构建调度表/结构。像这样:
// 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;
接下来,您的库的initialize函数应包含以下内容:
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 );
}
自然,您需要确保现代实现将运行时绑定用于旧平台上不存在的导出。 玩得开心!     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?