调度线程时的 void* 指针转换

void* pointer casting while scheduling a thread

本文关键字:指针 转换 void 线程 调度      更新时间:2023-10-16

我有一个由线程调用的函数,这个函数有一个唯一的参数,即queue::my_queue。所以我需要在线程调用的方法中对 void 指针执行强制转换,如下所示:

void *AddPacket(void *Ptr) 
{     queue<int> my_queue = (queue*)Ptr ; 
       my_queue.push(byte) ; 
}

总的来说,我确实:

int main()
{   // do business
  pthread_create(&thread, NULL, &AddPacket, (void*)queue) ; 
}

但这两种转换都是错误的。

第一次转换会导致错误:

请求"my_queue"中的成员"推送",该成员属于非类类型"队列*">

第二个:

从类型"队列"到类型"void*"的强制转换无效

如何解决问题?

您尝试将对象类型强制转换为指针类型。这是不允许的。我想你是C++的新手,所以我在这里发布了更正的代码来解开你的困惑并让你继续前进,但请阅读一本关于C++的书:

queue<int>* my_queue = (queue<int>*)Ptr ; 
my_queue->push(byte) ;
pthread_create(&thread, NULL, &AddPacket, &queue) ; 

记得阅读有关C++ :)的指针

尝试:

queue<int> *my_queue = (queue<int> *)Ptr ;
my_queue->push(byte) ;
pthread_create(&thread, NULL, &AddPacket, (void*)&queue) ; 
.

.无论如何,类似的东西

您需要更改线程函数和线程创建:

// thread entry point:
void *AddPacket(void *Ptr)
{
    reinterpret_cast<std::queue<int>*>(Ptr)->push(byte);
}

// thread creation:
std::queue<int> q;
pthread_create(&thread, NULL, &AddPacket, &q);
//                                        ^^^^ **pointer** to "q";
//                                        conversion to void* is implied