В цикле во время каждой итерации цикла создаю 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;
.
Вы передаете в поток указатель на структуру в автоматически управляемой памяти (на стеке), которая может быть удалена сразу после создания потока, но еще до его реального запуска. Естественно, что вы наблюдаете неопределённое поведение, с тем же успехом там могли быть случайные числа.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Задача такая, считать из файла название компании, далее пробел считать это в доход компанииПосле все закидывается в вектор структур, считывать...
При добавлении элемента в список, изменяется переменная k, причём иногда программа отрабатывает правильно k всегда равно пятиНо по каким-то...
Нужно, чтобы вычисленные в функции Min_Max значения адресов min и max сохранялись и передавались в функцию CountА функция Count должна считать элементы...
Для вывода объекта класса string с помощью printf можно воспользоваться методом c_str()