如何创建一个可以容纳数组的队列,更多的是在具有可变行数的数组上。
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
}
答案 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上阅读这些功能。同步(锁定/一致性/操作的原子性)由库本身来处理。