【问题标题】:c++; things to take care in multicore environmentC++;多核环境中的注意事项
【发布时间】:2009-01-17 13:12:12
【问题描述】:

在多核环境中编码时需要注意哪些事项?

例如,对于单例类,最好创建一个全局对象,然后返回其引用,而不是静态对象。

即 而不是拥有

MyClass & GetInstance()
{

static Myclass singleMyclass;
return singleMyclass;
}

最好有

Myclass singleMyclass;

 MyClass & GetInstance()
    {

     return singleMyclass;
    }

GetInstance() 可能被多个线程同时调用。

编辑:

我的问题是关于 c++ 的隐藏结构,在多线程程序中使用它们时必须注意。在上述情况下,静态不是线程安全的,因为编译器为静态对象添加了一些指令,这不是线程安全的。我正在寻找应该注意的类似结构。

【问题讨论】:

    标签: c++ multithreading


    【解决方案1】:

    您必须小心初始化静态变量。在静态对象在其构造函数中做很多事情的复杂系统中,初始化顺序可能会造成严重破坏。

    第一种方法更好,因为单例是按需创建的,但您需要一些锁定以使其线程安全。

    第二种方法是线程安全的,因为初始化是在创建任何线程之前完成的(假设您的静态对象不会启动线程运行),但是顺序或初始化可能是一个大问题!如果一个静态对象在实例化 singleMyclass 之前从它的构造函数调用 GetInstance() 怎么办? (提示:它不漂亮!)

    我建议使用第一种方法,但请阅读Double-checked locking,但要小心,因为它doesn't actually work

    确保您阅读了 Dobb 博士的文章。

    【讨论】:

    • 他的第一个示例一个静态局部变量(在全局范围内声明的非成员函数中)。
    • @j: ChrisW 在这里是正确的——本地静态的实例化被推迟到方法被调用。
    • ChrisW,丹尼尔:你说得对,我很抱歉。我一定是严重误读了OP的代码sn-p 8(我已经删除了我的评论和我的答案,现在已经无关紧要了。
    【解决方案2】:

    我的第一个答案解决了您的单例初始化示例,但是正如您在对问题的编辑中强调的那样,随着我们转向多核和多线程应用程序,您正在经历 C++ 更普遍的陷阱。以下是您第一次遇到它时的真正惊喜。虽然不是 C++ 特定的,但它肯定会影响 C++ 代码。

    乱序执行和内存屏障(或栅栏):

    一个问题是执行无序。由于现代硬件允许乱序执行优化,线程有可能看到在不同内核上乱序执行的其他线程的操作。因此,在单核机器上正确运行的多线程编码实际上可能在多核机器上不正确。

    解决此类问题的简单方法是增加临界区的范围。另一种是使用memory barriers或无锁算法。

    【讨论】:

      【解决方案3】:

      多核并不那么重要,因为您也可能在单核系统上获得多个线程。

      GetInstance() 的两个版本看起来都可以在那里工作,如果它们做任何不是线程安全的事情,则需要进行适当的锁定等的类方法。

      【讨论】:

        【解决方案4】:

        根据它的标题,我很想知道这个问题,但现在完全看不出它的相关性。

        多核编程的问题基本上是,如何构建程序以使这些内核获得最大负载;换句话说,如何并行化您的应用程序。

        对于有 C++ 项目的人来说,这方面的一个温暖建议是 Intel Threading Building Blocks 库(和 book)。它试图消除问题,将它们隐藏在模板类后面。我认为它做得很好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多