如何获得正确的线程ID和值

时间:2019-06-21 06:23:59

标签: c++ c++11 pthreads

我正在尝试将向量作为数据发送到pthread。但是当我尝试打印线程id时,它的即将到来的垃圾值。

如果我使用单线程运行此代码,则可以正常工作。但是当我用2个线程运行它时,它不起作用。

 #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 个答案:

答案 0 :(得分:1)

您正在为线程提供指向局部变量的指针。此变量随后在循环的右括号处立即销毁。 foo最终访问了一个悬空的指针,因此您的程序表现出未定义的行为。