在 C++ 中通过 Pthread_Create 打印通过结构传递的数组值

Printing Array Values Passed Thru a Struct Via Pthread_Create in C++

我的目标是让 second_func 打印以筛选从 p_thread create 传递给它的结构中包含的大小参数和第一个向量元素。问题在于打印矢量元素。我有以下代码:

#include <iostream>
#include <bits/stdc++.h>
#include <pthread.h>

using namespace std;
void first_func(vector<int>& vect);
void * second_func(void * args);

struct t_args {
   vector<int> *vect;
      int size;
   };

int main() {
   vector<int> vect;
   vect.push_back(100);
   first_func(vect);
   return 0;
}

void first_func(vector<int>& vect) {
   int record;                            
   pthread_t thread;                  
   struct t_args args;             
   args.vect = &vect;                   
   args.size = 5;                      
   record = pthread_create(&thread, NULL, &second_func, (void *)&args);
   if (record) { 
      cout << "Error - Not able to create thread." << record << endl;
      exit(-1);
    }
    pthread_join(thread, NULL);
}

void * second_func(void * args) {
   struct t_args params = *(struct t_args*) args;
   cout << "The value of the size param is " <<  params.size << endl;
   cout << "The value of the first element of the vector is " << params.vect[0] << endl;
   pthread_exit(NULL);
}

导致以下错误。

something.cpp: In function ‘void* second_func(void*)’:
something.cpp:38:63: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘std::vector<int>’)
    cout << "The value of the first element of the vector is " << params.vect[0]

完整的错误消息很长,但这是它的要点。该程序是使用以下命令编译的:

g++ file.cpp -std=c++11 -lpthread -o file

我很确定这是一个与指针和正确的取消引用语法相关的问题,但是,在多次尝试和更改语法之后,某种形式的错误仍然存​​在。

vector<int> *vect;

声明一个指向 vector 的指针。

params.vect[0]

会将指针线视为一个数组,并为您提供第一个 vector,而不是指向 vector 的第一个元素。

params.vect[0][0]

获取第一个 vector 然后是第一个 vector 的第一个元素,或者因为只有一个 vector

而误导性明显降低
(*params.vect)[0]
 ^ dereference operator gets vector at pointer

会得到你想要的元素。

顺便说一下,将指向局部变量的指针传递给线程时要非常小心。这次你是安全的,因为局部变量的范围是 main,如果 main 退出,程序和线程也会退出(通常。我还没有看到运行 [=33= 的情况) ] 没有的地方 (But apparently you can do it))。但是,如果您调用函数来启动线程并在线程中使用该函数的局部变量,则很有可能在线程运行时函数已返回并且变量超出范围。在变量超出范围后使用它是一个非常糟糕的场景。