首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
请问swoole的table强制解锁中,把lock = 1是正确的吗
### 问题描述 你好,我在看swoole_table代码的时候发现加锁的代码中遇到进程异常退出或者长时间持有锁的情况下,会强制解锁。 ```cpp void TableRow::lock() { sw_atomic_t *lock = &lock_; uint32_t i, n; long t = 0; while (1) { // 省略 /** * The process occupied by the resource no longer exists, * indicating that OOM occurred during the locking process, * forced to unlock */ if (kill(lock_pid, 0) < 0 && errno == ESRCH) { *lock = 1; swWarn("lock process[%d] not exists, force unlock", lock_pid); goto _success; } /** * Mark time */ if (t == 0) { t = swoole::time<std::chrono::milliseconds>(true); } /** * The deadlock time exceeds 2 seconds (SW_TABLE_FORCE_UNLOCK_TIME), * indicating that the lock process has OOM, * and the PID has been reused, forcing the unlock */ else if ((swoole::time<std::chrono::milliseconds>(true) - t) > SW_TABLE_FORCE_UNLOCK_TIME) { *lock = 1; swWarn("timeout, force unlock"); goto _success; } sw_yield(); } } ``` 这里进程退出或者持有时间超时会强制解锁,这里是把lock设置为1。 但是正常解锁逻辑的解锁操作是: ```cpp void unlock() { sw_spinlock_release(&lock_); } #define sw_spinlock_release(lock) *(lock) = 0 ``` 这里是直接把lock = 0表示解锁。 请问这两者冲突吗,谢谢。
发布于5年前 · 7 次浏览 · 来自
提问
MARiA
### 问题描述 你好,我在看swoole_table代码的时候发现加锁的代码中遇到进程异常退出或者长时间持有锁的情况下,会强制解锁。 ```cpp void TableRow::lock() { sw_atomic_t *lock = &lock_; uint32_t i, n; long t = 0; while (1) { // 省略 /** * The process occupied by the resource no longer exists, * indicating that OOM occurred during the locking process, * forced to unlock */ if (kill(lock_pid, 0) < 0 && errno == ESRCH) { *lock = 1; swWarn("lock process[%d] not exists, force unlock", lock_pid); goto _success; } /** * Mark time */ if (t == 0) { t = swoole::time<std::chrono::milliseconds>(true); } /** * The deadlock time exceeds 2 seconds (SW_TABLE_FORCE_UNLOCK_TIME), * indicating that the lock process has OOM, * and the PID has been reused, forcing the unlock */ else if ((swoole::time<std::chrono::milliseconds>(true) - t) > SW_TABLE_FORCE_UNLOCK_TIME) { *lock = 1; swWarn("timeout, force unlock"); goto _success; } sw_yield(); } } ``` 这里进程退出或者持有时间超时会强制解锁,这里是把lock设置为1。 但是正常解锁逻辑的解锁操作是: ```cpp void unlock() { sw_spinlock_release(&lock_); } #define sw_spinlock_release(lock) *(lock) = 0 ``` 这里是直接把lock = 0表示解锁。 请问这两者冲突吗,谢谢。
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2021-02-26
Rango
这个函数本身是进行加锁操作的,强制解锁的意思是,先解锁然后再执行加锁。所以设置为`1`
赞
0
回复
2021-02-27
MARiA
回复
Rango
厉害厉害,谢谢
赞
0
回复