我正在处理一个使用两个不同线程(th1
和th2
)的项目。它们通过extern
关键字共享多个对象和变量。它们是全局对象和全局变量
类似于:
extern Obj1 *obj1;
在我看来:
- 在不同线程中调用一组obj1
- 在不同线程中设置obj1的值
- 大量使用全局布尔变量,如信号量
这不是一种安全的编程方式,但我想有一些参考资料来证明它,比如一些不鼓励它的论文或书籍。有人能澄清吗?我假设一个x86平台正在与visualstudioc++一起使用。
规则很简单:如果任何线程修改对象(包括"对象"(如双精度或指针),以及多个线程访问它,则所有访问都必须受到保护。这是定义在C++11标准中,该标准基本上重述了适用于Posix的规则(据我所知Windows)。
除此之外,什么是安全的取决于你在做什么。在我的例如,我发现自己的代码很少需要非常常量全局对象;日志记录是唯一的例外(甚至在那里,大多数对象将是线程本地的,只有实际将日志消息刷新到时使用的共享对象其最终目的地)。大多数对象都是本地对象,或者动态分配,并且很少在螺纹。