Pthread путает параметры в pthread_create()

221
02 мая 2018, 05:19

В цикле во время каждой итерации цикла создаю 2 thread-а при помощи pthread_create(). Оба треда должны получать разные данные. А на деле получают одни и те же, которые были предназначены для 2-ого треда :

struct So{
    int a,b;
};
void * fn1(void * some) {
    auto data = (So*) some;
    std::cout << "Thread a=" << data->a << " b=" << data->b <<std::endl;
    pthread_exit(NULL);
}
int main() {
  pthread_t tid[8];
  for (int i = 0; i < 2; i++) {
      for (int index = 0; index < 2; index++) {
          So args{index*i, (index + 1)*i};
          pthread_create(&tid[index], nullptr, fn1, (void *) &args);
      }
      for (int index = 0; index < 2; index++) {
          pthread_join(tid[index], nullptr);
      }
  }
}

Если что на выходе получаем что-то такое:

Thread a=0 b=0
Thread a=0 b=0
Thread a=1 b=2
Thread a=1 b=2

В моём понимании должно было быть что-то вроде:

Thread a=0 b=0
Thread a=0 b=0
Thread a=0 b=1  <--- Тут отличия
Thread a=1 b=2

Что может являться причиной такого поведения?

P.S. Ответ дан как в комментарии, так и в секции ответы. Но хочу добавить, что стоит удалять выделенный на куче объект, т.е. перед pthread_exit(NULL) добавить delete data;.

Answer 1

Вы передаете в поток указатель на структуру в автоматически управляемой памяти (на стеке), которая может быть удалена сразу после создания потока, но еще до его реального запуска. Естественно, что вы наблюдаете неопределённое поведение, с тем же успехом там могли быть случайные числа.

READ ALSO
Помочь разобраться с потоками ввода из файла

Помочь разобраться с потоками ввода из файла

Задача такая, считать из файла название компании, далее пробел считать это в доход компанииПосле все закидывается в вектор структур, считывать...

221
Почему изменяется переменная k с 5 на 7 при работе с указателем?

Почему изменяется переменная k с 5 на 7 при работе с указателем?

При добавлении элемента в список, изменяется переменная k, причём иногда программа отрабатывает правильно k всегда равно пятиНо по каким-то...

206
Передача значений из одной функции в другую и сравнение адресов элементов стека

Передача значений из одной функции в другую и сравнение адресов элементов стека

Нужно, чтобы вычисленные в функции Min_Max значения адресов min и max сохранялись и передавались в функцию CountА функция Count должна считать элементы...

202
Можно ли использовать класс string вместе со scanf?

Можно ли использовать класс string вместе со scanf?

Для вывода объекта класса string с помощью printf можно воспользоваться методом c_str()

232