【问题标题】:Queue of variable length array or struct可变长度数组或结构的队列
【发布时间】:2012-08-20 08:21:41
【问题描述】:

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

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
}

【问题讨论】:

  • 有什么理由要从头开始编写队列吗?当有经过良好测试的标准 ADT 可用时,实现自己的 ADT 通常是个坏主意。你会花时间去寻找细微的错误,并且通常会编写与某人已经编写过的代码相同的代码。您是否考虑过使用提供队列的库?
  • @ArjunShankar 不,你有解决我问题的 C99 库的示例或链接吗?我没有找到一个,虽然我想这更有可能是我搜索能力差的结果。由于这是一个爱好项目,我不介意自己编写它,但是你是对的,预先测试的库可能更好。
  • @ArjunShankar 虽然你是对的,但大多数资深程序员多年来都积累了自己的生产质量 ADT 库......所以他不妨开始研究它,越早越好。这很奇怪,但是没有广泛认可的 C 语言 ADT 库,没有像 STL、Boost 等那样。我认为 Glib 永远不会获得这种认可,除非其中一家微软规模的公司采用它。跨度>

标签: c queue


【解决方案1】:

您可以使用现有库 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 上阅读。同步(锁定/一致性/操作的原子性)由库本身负责。

【讨论】:

猜你喜欢
  • 2023-03-04
  • 2014-11-14
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多