【发布时间】:2012-11-25 23:48:16
【问题描述】:
我在 PHP 中有一个操作,它检查具有 ID 的对象是否在数据库中,如果不是,则为其创建一个条目。同一ID的请求可以同时发生,所以我想防止ID被插入两次。
我目前正在使用以下代码来锁定/解锁对该特定密钥的数据库访问:
$semaphore = sem_get($keyForID, 1);
sem_acquire($semaphore);
// 1.) check for id
// 2.) insert object if it doesn't exist
sem_release($semaphore);
我的问题是: 由于我为每个对象 ID 创建了一个单独的信号量,我是否必须明确地使用 sem_remove 删除这些信号量,或者 PHP 会在 sem_release 之后自动执行此操作吗? ?
如果我必须明确删除信号量,是否有一种简单可靠的方法来检查该信号量当前是否被另一个线程获取,以便后者不会在sem_release 上崩溃?想到使用共享内存,但这需要另一个信号量来读取/写入线程数。
【问题讨论】:
标签: php multithreading