我在源文件a.c和b.c之间传递这样的队列
文件:a.c
sq[a]=new_queue();
pthread_create(&st[a],NULL,sendPacket,sq[a]);
档案:b.c
void *sendPacket(void *queue){
/* here i need to know which queue has come ,determine
the index of queue how can I do it? */
}
答案 0 :(得分:1)
创建队列的更高级别表示。看起来队列可能是void *
(你没有显示它的实际类型,即new_queue()
调用返回什么?),所以在添加附加参数的同时将其嵌入到结构中:
struct queue_state {
void *queue;
int index;
};
然后实例化一个结构,并将指针传递给线程函数:
struct queue_state qsa = malloc(sizeof *qsa);
if(qsa != NULL)
{
qsa->queue = new_queue();
qsa->index = 4711; /* or whatever */
pthread_create(&st[a], NULL, sendPacket, qsa);
}
然后线程函数可以使用struct
声明来访问所有字段。当然,声明需要位于两个C文件中包含的共享标题(例如queue.h
)中。
答案 1 :(得分:1)
您的问题描述非常粗糙。但至少根据我的理解,你实际上需要将2个参数传递给你的函数:(指向)队列(对我来说似乎是一个数组),以及这个队列中的索引。
您不能将您的参数打包在void*
类型的单个变量中。你可能会做的是声明一个包含所有必需参数的结构,填充它,并将指针传递给你的线程。
像这样(省略错误处理):
struct Params
{
queue* m_Queue;
size_t m_Idx;
};
// ...
Params* pParams = new Params;
pParams->m_Queue = sq;
pParams->m_Idx = a;
pthread_create(&st[a],NULL,sendPacket, pParams);
void *sendPacket(void *pPtr)
{
Params* pParams = (Params*) pPtr;
// ...
delete pParams;
}
答案 2 :(得分:0)
如果只是将索引传递给函数,可能会更容易:
void *sendPacket(int queue_idx) {
queue_t *queue = &sq[queue_idx];
}
答案 3 :(得分:0)
如果在 b.c 中您可以访问sq
,则只需将索引传递给队列即可。否则,您可以传递包含实际队列和索引