当周围有线程时,创建类的许多实例会失败吗?- 单例模式
Creating many instances of a class will fail when there are threads around? - Singleton pattern
在下面的代码中,我没有使用任何"线程"。创建多个实例仍然是一个问题吗? 如果我使用线程,那么由于线程共享地址空间 - 功能可能会被压缩。
当然,没有任何"需要"创建多个对象,但是我这样做(我在这里所做的方式(会成为问题吗?
#include <iostream>
using namespace std;
class boiler
{
private:
// Non static variables can't be initialized inside a class.
bool boilerEmpty;
bool mixtureBoiled;
public:
boiler ()
{
boilerEmpty = true;
mixtureBoiled = false;
}
void fillBoiler()
{
if (boilerEmpty == true)
{
cout << "nFill boiler.";
boilerEmpty = false;
}
}
void boilMixture ()
{
if ((boilerEmpty == false) && (mixtureBoiled == false))
{
cout << "nBoil mixture";
mixtureBoiled = true;
}
}
void drainMixture ()
{
if ((boilerEmpty == false) && (mixtureBoiled == true))
{
cout << "nDrain mixture.";
boilerEmpty = true;
}
}
};
int main ()
{
boiler b, c;
b.fillBoiler ();
b.boilMixture ();
b.drainMixture ();
c.fillBoiler ();
c.boilMixture ();
c.drainMixture ();
}
如果您只使用一个线程中的实例,那么拥有多个实例不会给您带来任何问题。 邀请不一致行为的唯一方法是尝试在多个线程中使用一个实例。
如果在多个线程中使用一个实例,则需要调查使用互斥锁信号量,以确保一次仅在一个线程中使用实例。
并发编程(无论是否实际的多线程(在多个执行线程之间存在共享的可变数据的情况下具有挑战性。
根据定义,任何不可变的东西都可以共享,而不会出现同步问题:
- 类数据:RTTI、虚拟表
- 函数代码:例如,在Linux上,操作系统使用特殊模式保护页面,以确保它们永远不会被写入
-
const
数据:字符串文字、幻数声明常量、...
因此,对于并发编程,您唯一应该担心的是可变数据最终如何共享。此共享可能以两种方式发生:
- 显式:将对变量的引用传递给另一个执行线程
- 隐式:臭名昭著的全局变量,其中静态类属性
在您的程序中,没有全局变量,因此共享将是显式的(如果您创建了第二个执行线程(。
相关文章:
- 使用用户定义的类型 UDT 实例化 std::atomic<>。如果 UDT 具有虚函数,则 l 墨水将失败。为什么?
- 模板实例化失败:编译器选择不正确的重载函数
- 显式实例化失败的原因是什么
- 使编译在模板类的特定实例化时失败
- 类模板的成员函数有条件无效(隐式实例化有效;显式实例化失败)
- Vulkan-加载扩展时实例创建失败
- 如果实例化,如何使模板化变量专用化在编译时失败
- ADO 连接创建实例在 Windows Server 2003 上失败
- 在这个失败的C++类实例化中,我忽略了什么明显的事情
- 双模板化函数实例化失败
- 函数模板实例化失败
- 模板实例化与 constexpr 函数失败
- 模板化赋值运算符模板实例化失败
- 当周围有线程时,创建类的许多实例会失败吗?- 单例模式
- std::conditional 的可变模板化使用,其中一种类型是实例化失败
- OpenGL ES 3实例渲染失败,但在桌面上工作
- 为什么局部变量的实例化失败,而静态变量没有
- c++:类实例的矢量,按类成员值搜索失败
- c++ dynamic_cast对装饰器实例化失败
- 由于抽象模板arg的实例化,Boost::lambda表达式编译失败.任何解释和/或解决方法