可变长度数组或结构的队列

时间:2012-08-20 08:21:41

标签: c queue

如何创建一个可以容纳数组的队列,更多的是在具有可变行数的数组上。

char data[n][2][50];
//Could be any non 0 n e.g:
n=1; data = {{"status","ok}};
// or
n=3; {{"lat", "180.00"},{"long","90.123"},{"status","ok}};
// and so on

n要添加到队列中。或者甚至有比我要问的更好的解决方案?一个队列很容易为单个数据项编写(或找到可重用的例子),但我不确定我将使用什么方法来实现上述目的。也许是结构?这将解决数组和n ......但它会解决变量数组吗?

更广泛地说,我试图解决的问题是这个。 我需要使用POST与Web服务器通信。我已经编写了这个代码,但是我不希望每次执行此任务时都保持主线程忙,特别是因为我需要进行其他检查,例如连接,如果不是我需要退后等待或尝试将其重新联机。

我的想法是让一个单独的专门负责这项任务。我认为创建一个队列将是主线程让子线程知道该做什么的最佳方式。

数据将是可变数量的字符串对。像:

主要

//Currently does
  char data[MAX_MESSAGES_PER_POST][2][50];
  ...
  assembles array
  sendFunction(ptrToArray, n);
  resumes execution with large and un predicatable delay

//Hopefully will do
  ...
  queue(what needs doing)
  carry on executing with (almost) no delay

while(0)
{
  if(allOtherConditionsMet())  //Device online and so forth
  {
    if(!empty(myQueue))
    {
       //Do work and deque
   }
 }
 else
 {
     //Try and make condition ok. Like reconect dongle.
 }
  // sleep/Back off for a while
}

1 个答案:

答案 0 :(得分:2)

您可以使用现有的库like Glib。 GLib是跨平台的。如果您使用GLib's asynchronous queues,则可以执行以下操作:

创建队列的第一个线程执行:

GAsyncQueue *q = g_async_queue_new ();

其他线程可以引用(显示使用队列的意图):

g_async_queue_ref (q);

在此之后,任何线程都可以通过以下方式将项目“推送”到队列中:

struct queue_item i;
g_async_queue_push (q, ( (gpointer) (&i)));

任何线程都可以使用以下命令从队列中“弹出”项目:

struct queue_item *d = g_async_queue_pop (q);
/* Blocks until item is available.  */

一旦线程完成使用队列并且不再关心它,它就会调用:

g_async_queue_unref (q);

即使是创建队列的线程也需要这样做。

还有许多其他有用的功能,您可以在the page documenting them上阅读这些功能。同步(锁定/一致性/操作的原子性)由库本身来处理。