1

如何创建一个可以容纳数组的队列,而不是具有可变行数的数组。

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
}
4

1 回答 1

3

您可以使用现有的库,例如 Glib。GLib 是跨平台的。如果您使用GLib 的异步队列,您会执行以下操作:

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

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);

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

还有许多其他有用的功能,您都可以在记录它们的页面上阅读它们。同步(锁定/一致性/操作的原子性)由库本身负责。

于 2012-08-20T09:14:21.580 回答