Почему я не могу использовать volatile вместе с вектором в C ++? - PullRequest
0 голосов
/ 19 февраля 2019

Короткий вопрос.Я хотел бы использовать изменяемый векторный объект в многопоточном приложении.

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