如何限制服务器上的C函数在任何时刻最多运行此函数的一个实例?

时间:2012-03-16 03:31:50

标签: c

我的(Linux)应用程序服务器上有一个(ANSI)C函数,客户端可以访问它来执行数字运算。我理解服务器通常工作的方式是它们从多个客户端接收请求并并行处理这些请求。也就是说,可以调用服务器上的相同C函数(并且更重要的是,可以运行)与希望使用它的客户端一样多次(假设有足够的系统资源,例如CPU,存储器等)。

问题是对C函数的一次调用实际上使用了整个服务器资源。为了便于讨论,假设如果同时运行C函数的两个实例,则系统崩溃。

问题:有没有办法可以确保最多只允许此函数的一个实例(同时)运行?

2 个答案:

答案 0 :(得分:3)

有多种方法可以做到这一点。出于您的目的,我认为锁定文件的简单,老式技术可能与任何技术一样好,而且比某些技术更好。函数(或函数的包装器)将查看它是否可以创建锁定文件。如果可以,它继续运行,然后在完成后删除锁定文件。如果它无法创建文件,它会查看文件包含的内容 - 它应该是运行该函数的最后一个进程的PID。如果PID仍然存在(使用kill(0, pid)检查),则不允许运行。如果PID不存在,那么它会在没有清理其锁定文件的情况下死掉,你应该......担心是否有另一个进程也检测到PID不在那里。

答案 1 :(得分:3)

这就是互斥体的用途 - 允许相互排斥。只有一个实例/线程/进程可以锁定互斥锁。其他实体在尝试时会失败,并且会在所有者解锁互斥锁之前继续失败。