为什么我不能在C ++中将volatile与向量一起使用?

时间:2019-02-19 11:14:25

标签: c++ vector volatile

一个简短的问题。我想在多线程应用程序中使用易失性矢量对象。

volatile std::vector<T> my_vector; // T is an integer type

对其的调用,例如,调整大小函数

T P = 8;
sh->u.s.my_vector.resize(P); // P is just like T, an integer

给我一​​个编译时错误:“没有匹配的成员函数来调用'resize'。”

问题是,此向量在一个易失性类内部,该类在这样的线程之间共享:

shared_info_template<T> volatile *sh;

因此,即使删除向量的“ volatile”修饰符仍然会产生错误。

我的目标:我只想在可以运行多个线程的共享对象中使用可调整大小的数组。如果vector不起作用怎么办?

信息:我正在Linux上使用Clang 7 C ++。


完整代码(已删除其他不相关的部分):

kmp.h

typedef struct dispatch_shared_info32 {
  ...
  volatile std::vector<kmp_real32> dbl_vector;
} dispatch_shared_info32_t;

typedef struct dispatch_shared_info64 {
  ...
  volatile std::vector<kmp_real64> dbl_vector;
} dispatch_shared_info64_t;

kmp_dispatch.h

// 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;
  ...
};

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

0 个答案:

没有答案