一个简短的问题。我想在多线程应用程序中使用易失性矢量对象。
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);