当前位置: 首页 > 知识库问答 >
问题:

php - 进程互斥问题?

扈韬
2023-07-28
<?phpini_set('display_errors',1);ini_set('display_startup_errors',1);error_reporting(-1);$file = "/www/tp/signal.txt";$key  = ftok($file, "x");$semaphore = sem_get($file, 1, 0666, false);sem_acquire($semaphore);echo "hello world";sleep(20);

我写了一个简单的互斥信号量程序,在两个终端中打开,在没有主动释放信号量的同时,当一个进程结束为什么另一个进程没有被阻塞而是拿到了信号量?进程结束会主动释放信号量吗(程序里没有释放信号量的操作)?希望有大佬帮忙解答一下,为什么两个进程都正常运行了,谢谢!
GIF 2023-7-27 23-28-09.gif

共有1个答案

雷锋
2023-07-28

sem_acquire

sem_acquire() by default blocks (if necessary) until the semaphore can be acquired. A process attempting to acquire a semaphore which it has already acquired will block forever if acquiring the semaphore would cause its maximum number of semaphore to be exceeded.

After processing a request, any semaphores acquired by the process but not explicitly released will be released automatically and a warning will be generated.

请求处理完会自动释放。


操作系统层面上,参见sem_close:

All open named semaphores are automatically closed on process termination, or upon execve(2).
 类似资料:
  • 问题内容: 阅读有关锁定PHP的一些文章。 它们主要都直接指向http://php.net/manual/en/function.flock.php。 本页讨论如何在硬盘上打开文件! 真的是这样吗?我的意思是,这使锁定变得非常昂贵-这意味着每次要锁定时,我都必须访问硬盘)= 能再给我一个令人愉快的消息安慰我吗? 编辑: 由于我已经收到了一些答复,我想问这个。 我的脚本只能由一个或多个线程运行?因为

  • 问题内容: 我需要在Java中实现某种进程间互斥。我正在考虑按照此[线程的](http://codingdict.com/questions/1808建议使用FileLock API 。我基本上将使用一个虚拟文件并将其锁定在每个进程中。 这是最好的方法吗?还是这样的东西内置在标准API中(我找不到)。 有关更多详细信息,请参见以下内容: 我编写了一个应用程序,该应用程序可以读取一些输入文件,并根据

  • 问题内容: 我想使用互斥锁,该互斥锁将用于同步访问内存共享黑白中两个不同进程中的某些变量。我该如何实现。执行该代码示例将不胜感激。 问题答案: 而是 使用初始化为的POSIX信号量 。 (请参见下文)用于未命名的信号灯或已命名的信号灯。 最初发布此答案很多年后,必须对其进行更新。 实际上应该使用互斥对象而不是信号量 。R和kuga的评论(如下逐字复制)解释了原因。特别是,我发现kuga提到互斥锁只

  • 问题内容: 是多线程/进程编程的新手。所以这是我需要澄清的。 处理代码 使用上述伪代码,如果互斥锁未解锁,进程B是否可以访问? 如何从进程B正确访问sharedResource? 有没有清晰的可视化图表说明互斥体,线程和进程之间的关系? 问题答案: 您需要做的是调用pthread_mutex_lock来保护互斥锁,如下所示: 一旦执行此操作,在您在该线程中进行调用之前,不会再进行任何其他调用。因此

  • 互斥是多线程系统中用于控制访问的一个原对象(primitive object)。下面的例子给出了它最基本的用法: std::mutex m; int sh; //共享数据 // … m.lock(); // 对共享数据进行操作: sh += 1; m.unlock(); 在任何时刻,最多只能有一个线程执行到lock()和unlock()之间的区域(通常称为临界区)。当第一个线程正在临界区执行时

  • Go语言包中的 sync 包提供了两种锁类型:sync.Mutex 和 sync.RWMutex。 Mutex 是最简单的一种锁类型,同时也比较暴力,当一个 goroutine 获得了 Mutex 后,其他 goroutine 就只能乖乖等到这个 goroutine 释放该 Mutex。 RWMutex 相对友好些,是经典的单写多读模型。在读锁占用的情况下,会阻止写,但不阻止读,也就是多个 gor