Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么可以';在C+中,我将volatile与向量一起使用+;?_C++_Vector_Volatile - Fatal编程技术网

C++ 为什么可以';在C+中,我将volatile与向量一起使用+;?

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 vector对象

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);