LINUX.ORG.RU

История изменений

Исправление kvpfs_2, (текущая версия) :

Откуда инфа, что он брал адреса? Этого в «дано» вообще не было, он передал индекс, вот такое будет вполне рабочим:

struct S {
   jthread t;
   int i = 0;
   S(void(*f)(int), int idx) : t(f, idx) {}
   static void tfn(int i);
};
vector<S> v;
mutex mtx;

void S::tfn(int i) {
   while (true) {
      this_thread::sleep_for(1s);
      lock_guard l(mtx);
      ++ v[i].i;
   }
}

int main() {
   int cnt = 0;
   auto add = [&]() {
      lock_guard l(mtx);
      v.emplace_back(S::tfn, cnt++);
      v.emplace_back(S::tfn, cnt++);
   };

   while (true) {
      this_thread::sleep_for(1s);
      add();
   }
}

Без всякого резерва, можно сколь угодно добавлять элементы, с переаллокацией.

Может и брал адреса, неясно, но может наговнокодил с синхронизцацией. А его второй пример, где запуск в отдельном цикле - там проблемы уже нет, тк запуск потоков в главном «synchronized-with» началом выполнения в новых, и, естественно, санитайзеры ошибку уже находить не будут

Исходная версия kvpfs_2, :

Откуда инфа, что он брал адреса? Этого в «дано» вообще не было, он передал индекс, вот такое будет вполне рабочим:

struct S {
   jthread t;
   int i = 0;
   S(void(*f)(int), int idx) : t(f, idx) {}
   static void tfn(int i);
};
vector<S> v;
mutex mtx;

void S::tfn(int i) {
   while (true) {
      this_thread::sleep_for(1s);
      lock_guard l(mtx);
      ++ v[i].i;
   }
}

int main() {
   int cnt = 0;
   auto add = [&]() {
      lock_guard l(mtx);
      v.emplace_back(S::tfn, cnt++);
      v.emplace_back(S::tfn, cnt++);
   };

   while (true) {
      this_thread::sleep_for(1s);
      add();
   }
}

Без всякого резерва, можно сколь угодно добавлять элементы, с переаллокацией.

Может и брал адреса, неясно, но может наговнокодил с синхронизцацией. А его второй пример, где запуск в отдельном цикле - там проблемы уже нет, тк запуск потоков в главно «synchronized-with» началом выполнения в новых, и, естественно, санитайзеры ошибку уже находить не будут