2

我有一个线程调用的函数。这个函数有一个唯一的参数,它是 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'中的成员'push',它是非类类型'queue*'</p>

第二个:

从类型“队列”到类型“无效*”的无效转换</p>

我该如何解决这个问题?

4

3 回答 3

4

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

queue<int>* my_queue = (queue<int>*)Ptr ; 
my_queue->push(byte) ;

pthread_create(&thread, NULL, &AddPacket, &queue) ; 

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

于 2012-08-06T20:48:01.797 回答
3

尝试:

queue<int> *my_queue = (queue<int> *)Ptr ;
my_queue->push(byte) ;

pthread_create(&thread, NULL, &AddPacket, (void*)&queue) ; 

..无论如何,沿着这些思路

于 2012-08-06T20:46:43.307 回答
1

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

// 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
于 2012-08-06T20:52:01.817 回答