C++ 为什么可以';在C+中,我将volatile与向量一起使用+;?
一个简短的问题。我想在多线程应用程序中使用volatile vector对象C++ 为什么可以';在C+中,我将volatile与向量一起使用+;?,c++,vector,volatile,C++,Vector,Volatile,一个简短的问题。我想在多线程应用程序中使用volatile vector对象 volatile std::vector<T> my_vector; // T is an integer type 给我一个编译时错误:“没有匹配的成员函数来调用‘resize’” 问题是,该向量位于一个易失性类中,该类在线程之间共享,如下所示: shared_info_template<T> volatile *sh; 共享信息模板volatile*sh; 因此,即使移除向量的“vol
volatile std::vector<T> my_vector; // T is an integer type
给我一个编译时错误:“没有匹配的成员函数来调用‘resize’”
问题是,该向量位于一个易失性类中,该类在线程之间共享,如下所示:
shared_info_template<T> volatile *sh;
共享信息模板volatile*sh;
因此,即使移除向量的“volatile”修饰符,仍然会产生错误
我的目标:我只想在共享对象中使用一个可调整大小的数组,多个线程可以对其进行操作。如果向量不工作,如何执行此操作
<强>信息>强:我在Linux上使用CLANG 7 C++。
完整代码(已删除其他非相关部分): kmp.h
typedef结构分派\u共享\u信息32{
...
volatile std::vector dbl_vector;
}发送共享信息32;
类型定义结构分派\u共享\u信息64{
...
volatile std::vector dbl_vector;
}发送共享信息64;
kmp_调度
// replaces dispatch_shared_info{32,64} structures and
// dispatch_shared_info{32,64}_t types
template <typename T> struct dispatch_shared_infoXX_template {
typedef typename traits_t<T>::unsigned_t UT;
typedef typename traits_t<T>::floating_t DBL;
...
volatile std::vector<DBL> dbl_vector;
...
};
// replaces dispatch_shared_info structure and dispatch_shared_info_t type
template <typename T> struct dispatch_shared_info_template {
typedef typename traits_t<T>::unsigned_t UT;
union shared_info_tmpl {
dispatch_shared_infoXX_template<UT> s;
dispatch_shared_info64_t s64;
} u;
...
};
//替换调度共享信息{32,64}结构和
//分派共享信息{32,64}\t类型
模板结构分派\u共享\u infoXX\u模板{
typedef typename traits_t::unsigned_t UT;
typedef typename traits_t::floating_t DBL;
...
volatile std::vector dbl_vector;
...
};
//替换调度共享信息结构和调度共享信息类型
模板结构分派\u共享\u信息\u模板{
typedef typename traits_t::unsigned_t UT;
联合共享信息{
发送共享的infoXX模板;
调度共享信息64;
}u;
...
};
kmp_dispatch.cpp
...
dispatch_shared_info_template<T> volatile *sh;
...
sh = reinterpret_cast<dispatch_shared_info_template<T> volatile *>(
&team->t.t_disp_buffer[my_buffer_index % __kmp_dispatch_num_buffers]);
...
sh->u.s.dbl_vector.resize(P);
。。。
发送共享信息模板volatile*sh;
...
sh=重新解释铸件(
&团队->t.t\U调度缓冲区[我的缓冲区\索引%\ kmp\调度\数量\缓冲区];
...
sh->u.s.dbl_矢量。调整大小(P);
volatile
不会帮助您实现目标。你应该使用互斥锁/锁和其他形式的线程同步。你为什么要这样做<代码>volatile并不意味着“线程安全”。volatile:“不要优化我。亲爱的编译器,如果您没有意识到这一点,我的值可能会改变。”就是这样。你的问题在别处。你不能有一个(有用的)volatile std::vector
,因为std::vector
的成员函数都没有volatile
重载。据我所知,这是一个有意识的设计决策。(另外,正如其他人所提到的,volatile
不是线程同步机制。似乎您可能需要一个实际的并发数据结构,而此时的标准库没有,IIRC。)因为volatile
限定了sh
所指的对象,所以它的成员是volatile
,与const
应用于const
限定对象的成员的方式完全相同。与决定添加所有这些volatile
的人交谈,他们似乎对它的作用有非常错误的想法。也许您需要一个std::atomic
// replaces dispatch_shared_info{32,64} structures and
// dispatch_shared_info{32,64}_t types
template <typename T> struct dispatch_shared_infoXX_template {
typedef typename traits_t<T>::unsigned_t UT;
typedef typename traits_t<T>::floating_t DBL;
...
volatile std::vector<DBL> dbl_vector;
...
};
// replaces dispatch_shared_info structure and dispatch_shared_info_t type
template <typename T> struct dispatch_shared_info_template {
typedef typename traits_t<T>::unsigned_t UT;
union shared_info_tmpl {
dispatch_shared_infoXX_template<UT> s;
dispatch_shared_info64_t s64;
} u;
...
};
...
dispatch_shared_info_template<T> volatile *sh;
...
sh = reinterpret_cast<dispatch_shared_info_template<T> volatile *>(
&team->t.t_disp_buffer[my_buffer_index % __kmp_dispatch_num_buffers]);
...
sh->u.s.dbl_vector.resize(P);