Как получить правильный идентификатор и значение потока - PullRequest
1 голос
/ 21 июня 2019

Я пытаюсь отправить вектор как данные в pthread. Но когда я пытаюсь напечатать идентификатор потока, его поступающее значение мусора.

Если я запускаю этот код с одним потоком, он работает нормально. Но когда я запускаю его с двумя потоками, он не работает.

 #include <iostream>
#include <pthread.h>
#include <vector>
using namespace std;

struct val {
    int data;
    int sData;

};

void *foo(void *a)
{
   vector <val>* b = (vector <val>*)a;

   for (val it : *b) {
    std::cout <<" thread " <<it.data;
    std::cout <<" &&&  " <<it.sData<<"-----------"<<endl;
   }
}

int main()
{
  pthread_t thr[2];

  for (int j = 0; j < 2; j++) {
      std::vector <val> *a = new std::vector<val>(10);
      for (int i = 0; i< 10; i++) {
        val t;
        t.data = j;
        t.sData = j*10;
        a->push_back(t);
      }
      pthread_create(&thr[j], NULL, &foo, &a);
}
  pthread_join(thr[0],NULL);
  pthread_join(thr[1],NULL);
  return 0;
}

Ожидаемый результат:

thread 0 &&& 0
....
....
thread 1 &&& 10
thread 1 &&& 10
....
....

1 Ответ

1 голос
/ 21 июня 2019

Вы даете потоку указатель на локальную переменную. Эта переменная уничтожается сразу же после закрывающей скобки цикла. foo завершает доступ к висячему указателю, после чего ваша программа демонстрирует неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...