Короткий вопрос.Я хотел бы использовать изменяемый векторный объект в многопоточном приложении.
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» вектора по-прежнему приводит к ошибке.
Моя цель: Я просто хочу использовать массив с изменяемым размером в этом общем объекте, с которым могут работать несколько потоков.Как это сделать, если вектор не работает?
Информация : Я использую Clang 7 C ++ в Linux.
Полный код (удалендругие не связанные части):
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);