【发布时间】:2021-05-13 16:07:23
【问题描述】:
我一直遵循creating POSIX threads 上的说明,并密切关注他们的示例Pthread Creation and Termination。
根据他们的示例,他们将一个 long 整数值传递给 pthread_create(),这会导致类似于此的调用:
pthread_create(&thread, NULL, do_something, (long*)testVal);
我要运行的代码草图是:
#include <iostream>
#include <pthread.h>
using namespace std;
// Simple example class.
class Range {
public:
int start;
int end;
Range(int start_bound, int end_bound) {
start = start_bound;
end = end_bound;
}
void print() {
cout << "\n(" << start << ", " << end << ')';
}
};
void* do_something(void* testVal) {
std::cout << "Value of thread: " << (long)testVal << '\n';
pthread_exit(NULL);
}
int main() {
pthread_t thread;
Range range = Range(1, 2); // What I really want to pass
long testVal = 42; // Let's test
pthread_create(&thread, NULL, do_something, (void*)testVal);
pthread_exit(NULL);
}
这是在老师希望我们在 Linux 中使用 gcc 的作业的上下文中,所以我正在使用带有这些编译参数的 Linux 的 Windows 子系统:
gcc program.cpp -o program -lstdc++ -lpthread
运行上述程序会输出“线程值:42”。
我的 C++ 指针经验比我落后几年,但只是为了好玩,让我们将数据类型从 long 更改为 int。这会将语句更改为 int testVal = 42 和 std::cout << "Value of thread: " << (int)testVal << '\n';。但是,会发生这种情况:
错误:从“void*”转换为“int”会丢失精度 (int)testVal
警告:从不同大小的整数转换为指针 pthread_create(&thread, NULL, do_something, (void*)testVal);
使用整数数据类型不是我想要做的,但我将这种情况包括在内,因为我的猜测是问题从这里开始复合。
问题
如何将Range 对象传递给pthread_create()?我需要做类似的事情,
void* do_something(void* range) {
(Range)range.print();
...
...但是遇到了一堆类型错误。研究有关传递此值的其他问题并没有带来太多的明确性。返回的主要问题是从类型“Range”到类型“void*”的无效转换。我对将 void 指针传递给一个值与将 void 指针传递给一个寻址类型之间的区别不够精通,以了解出了什么问题。测试指针引用、取消引用和强制转换的各种组合并没有帮助。
【问题讨论】:
-
(void*)&testValtestVal的地址