将队列作为c中的参数传递

时间:2012-05-20 14:16:22

标签: c parameters queue

我在源文件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? */
}

4 个答案:

答案 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,则只需将索引传递给队列即可。否则,您可以传递包含实际队列和索引

的结构