在 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))。但是,如果您调用函数来启动线程并在线程中使用该函数的局部变量,则很有可能在线程运行时函数已返回并且变量超出范围。在变量超出范围后使用它是一个非常糟糕的场景。
我的目标是让 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))。但是,如果您调用函数来启动线程并在线程中使用该函数的局部变量,则很有可能在线程运行时函数已返回并且变量超出范围。在变量超出范围后使用它是一个非常糟糕的场景。