C++ 多线程与面向对象

C++ 多线程与面向对象,c++,multithreading,oop,global-variables,C++,Multithreading,Oop,Global Variables,我正在处理一个使用两个不同线程的项目(th1和th2)。它们通过extern关键字共享多个对象和变量。它们是全局对象和全局变量 比如: extern Obj1 *obj1; 在我看来: 在不同线程中调用obj1的metod 在不同的螺纹中设置obj1的值 大量使用全局布尔变量,如信号量 这不是一种安全的编程方式,但我想有一些参考来证明它,比如一些不鼓励它的论文或书籍。有人能澄清一下吗?我假设X86平台正在与VisualStudioC++一起使用。< P>规则很简单:如果任何线程修改对象(包括

我正在处理一个使用两个不同线程的项目(
th1
th2
)。它们通过
extern
关键字共享多个对象和变量。它们是全局对象和全局变量

比如:

extern Obj1 *obj1;
在我看来:

  • 在不同线程中调用obj1的metod
  • 在不同的螺纹中设置obj1的值
  • 大量使用全局布尔变量,如信号量
    这不是一种安全的编程方式,但我想有一些参考来证明它,比如一些不鼓励它的论文或书籍。有人能澄清一下吗?我假设X86平台正在与VisualStudioC++一起使用。

    < P>规则很简单:如果任何线程修改对象(包括 “对象”(如双精度或指针)和多个线程 访问它,则必须保护所有访问。这是 在C++11标准中定义,基本上重申了 在Posix下应用的规则(据我所知,在 窗户也一样)

    除此之外,什么是安全的取决于你在做什么。在我的 例如,我发现自己的代码很少需要非常量 全球目标;日志记录是唯一的例外(甚至是例外) 在这里,大多数对象都是线程本地的,只有 日志消息实际刷新到时使用的共享对象 最终目的地)。大多数对象都是局部对象,或者是局部对象 动态分配,并且很少在用户之间共享
    线程

    与“安全”无关;这都是关于“正确”:你的程序必须没有数据竞争才能正确。是的,但在我看来,在两个不同的线程中使用相同的变量会自动产生问题。为了避免这种情况,你必须使用某种锁,但为什么要使用多线程?@BiA因为线程之间必须共享的对象非常罕见。@JamesKanze-如果它们灭绝了就好了。@BiA:你可能对所谓的“继承异常”感兴趣。最近一篇讨论它的论文是:。