睡眠,信号量的替代品

时间:2016-10-21 17:30:11

标签: c sleep

我有一个简单的c程序(在linux上)。该计划的步骤如下:

  1. 在while循环中,它调用一个只返回一条记录的查询。它本质上是一个查找名为" processing"的列的视图。值为" 0"并使用"限制1"。

  2. 我读取结果集中的记录并执行一些计算并将结果上传回数据库。我还将处理后的列设置为" 1"。

  3. 如果此查询未返回任何记录,则退出while循环。

  4. 退出while循环后,程序退出。

  5. 一旦完成运行,我不希望程序退出。原因是数据库可能在接下来的30分钟内获得更多符合条件的记录。我希望这个程序是长期运行的程序,它将检查任何新记录并再次启动while循环来处理记录。

    我没有做任何多线程或花哨的东西。我做了一些谷歌,发现帖子谈论信号量。

    这是正确的方法吗?是否有任何简单的信号量示例和解释?

1 个答案:

答案 0 :(得分:1)

首先,我希望您使用交易。否则可能存在1到2之间的竞争条件。

我认为您的问题是" 当您在SQL表中处理更多信息时,您的程序如何知道?"有几种方法可以做到这一点。

最简单的是polling。如果有任何工作,你的程序会经常检查。如果没有,它会睡一会儿。如果检查便宜,或者您不经常检查,则轮询很好。它非常强大,工人和供应商之间不需要协调。工人只是检查工作。

另一种方法是使程序块在某种I / O上等待锁定文件。这就是信号量的含义。它是这样的。

  1. 队列为空。
  2. 生产者获取信号量文件的独占锁。
  3. 您的工作人员试图锁定信号量文件,它会阻止。
  4. 生产者添加到队列并释放其锁定。
  5. 工人立即解除封锁。
    1. 检查队列
    2. 是否有效。
  6. ...但重置系统是一个问题。生产者在没有轮询的情况下不知道队列何时再次为空。这需要添加到SQL表的所有内容都知道此过程并且位于同一台机器上。即使你开始工作,它也很容易受到僵局和竞争条件的影响。

    另一种方式是通过信号。生产者进程向工作进程发送一个信号说'#34;我添加了一些工作"。如上所述,这需要在添加到SQL表和工作者之间进行协调。

    更好的解决方案是不将SQL用于工作队列。它本身就是你要投票的东西。而是使用命名或网络管道。管道自动充当队列。生产者在添加工作时会写入管道。工人连接到管道并从中读取以获得更多工作。如果没有工作,就会悄悄阻止等待工作。管道可以包含完成工作所需的所有信息,或者它可以包含其他地方有工作的指示(如行的ID)。

    最后,根据需要处理多少处理,您可以尝试在由表更新触发的存储过程中执行所有处理。