C++ 字段的构造函数中是否需要互斥?

C++ 字段的构造函数中是否需要互斥?,c++,mutex,C++,Mutex,编辑:我可能不够清楚。是否不存在涉及处理器缓存或类似内容的问题?我的意思是,如果没有用于初始化内存区域(即我的字段)的互斥体,那么另一个线程是否没有读取一些垃圾值的风险?您的对象只能初始化一次,并且在初始化之前您将无法使用它,因此您不需要在那里使用互斥体。但是,您需要在DoIt函数中使用互斥锁或其他合适的锁,正如您所说,这将跨多个线程访问 更新已编辑的问题:不,您不需要担心处理器缓存。您必须先构造对象,然后才能对其拥有句柄。只有拥有这个句柄,才能将它传递给其他线程使用。我想说的是,生成的线程必须

编辑:我可能不够清楚。是否不存在涉及处理器缓存或类似内容的问题?我的意思是,如果没有用于初始化内存区域(即我的字段)的互斥体,那么另一个线程是否没有读取一些垃圾值的风险?

您的对象只能初始化一次,并且在初始化之前您将无法使用它,因此您不需要在那里使用互斥体。但是,您需要在
DoIt
函数中使用互斥锁或其他合适的锁,正如您所说,这将跨多个线程访问


更新已编辑的问题:不,您不需要担心处理器缓存。您必须先构造对象,然后才能对其拥有句柄。只有拥有这个句柄,才能将它传递给其他线程使用。我想说的是,生成的线程必须在构建原始对象之后开始,不可能以相反的方式发生

无法对尚未创建的对象调用
doit()
,因此构造函数中不需要互斥

如果
doit()
是访问该字段的唯一方法,那么应该可以

如果类的其他方法也访问该字段,即使是从单个线程访问,那么在这些方法中也必须使用互斥

  • 你首先需要在那些讨厌的线程得到它之前构造这个对象。操作系统将为仅由一个线程调用的构造函数分配内存。操作系统负责分配,因此您无需做任何事情。你甚至可以在两个不同的线程中创建同一类的两个对象
  • 您可以非常保守,在使用该字段锁定、释放和结束的任何方法的开头使用互斥锁

  • 或者,如果您了解各种方法与各种算法的交互作用,您可以使用互斥锁来访问使用该字段的代码,也就是说,该部分代码需要确保该字段在处理过程中不会被另一个线程更改,但您可以在关键部分之后释放锁,做点别的事情,然后可能会有另一个关键部分。

    我想你是糊涂了。+1.每个对象都有自己的字段副本,构造函数只调用一次,它将初始化字段2.每个线程都有其对象的副本,因此不需要互斥3.在任何情况下,即使线程共享该对象,该字段也始终被初始化,因为已经对此类对象调用了构造函数++++++好的,还有两个问题:a)生成线程是内存障碍(当内存与缓存同步时程序中的一个点)?b) 我不明白你的最后一句话。我可以将对象的句柄传递给正在运行的线程。这不是内存障碍,为了在线程中使用对象,必须首先创建对象。然后将创建的对象传递给线程,线程将对其执行操作(
    DoIt
    )。