История изменений
Исправление 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» началом выполнения в новых, и, естественно, санитайзеры ошибку уже находить не будут