在同一线程上使用 Boost 互斥锁。
2012-12-10 21:34:57
收藏:0
阅读:116
评论:2
我刚开始使用 boost 库,这是一个非常棒的库!同时,我也对互斥锁不太熟悉,如果我犯了新手错误,请多多包涵。
无论如何,我有两个名为 FunctionOne 和 FunctionTwo 的函数。这两个函数由不同的线程异步调用。所以这里发生了什么:在 FunctionOne 中,我在函数开始处锁定全局互斥锁,在函数结束处解锁全局互斥锁。FunctionTwo 同理。
现在问题来了:有时候,FunctionOne 和 FunctionTwo 被调用的时间间隔小于几毫秒(虽然不总是)。所以,FunctionOne 开始执行,半路上 FunctionTwo 执行。当 FunctionTwo 锁定互斥锁时,FunctionOne 和 FunctionTwo 所在的整个线程都被停止,因此 FunctionOne 被卡在半路上,线程在 FunctionTwo 中等待自己,永远无法结束。因此,总结一下:
- 函数1锁定互斥锁并开始执行代码。
- 几毫秒后调用函数2并锁定互斥锁,冻结函数1和2所在的线程。
- 现在,函数1卡在半路上,线程被冻结,所以函数1永远无法完成,互斥锁永远被锁定,等待函数1完成。
在这种情况下应该怎么办?以下是我的代码:
boost::mutex g_Mutex;
lua_State* L;
// 从其他线程调用函数1
void FunctionOne()
{
g_Mutex.lock();
lua_performcalc(L);
g_Mutex.unlock();
}
// 从其他线程几毫秒后调用函数2,冻结线程
// 函数1永远无法完成
void FunctionTwo()
{
g_Mutex.lock();
lua_performothercalc(L);
g_Mutex.unlock();
}
点赞
用户1858151
你的描述是错误的。一个 mutex 不能被两次锁定。你有一个不同的问题。
- 在 mutex 被锁定时检查是否可重入。
- 检查异常。
为了避免异常问题,你应该使用 boost::mutex::scoped_lock(RAAI)来锁定。
2012-12-10 17:59:41
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
这些函数是否有意使其可重入,即FunctionOne在持有mutex时将调用自身或FunctionTwo?反之亦然,FunctionTwo锁定mutex,然后在mutex保持锁定状态时调用FunctionOne/FunctionTwo?
如果不是这样,请勿从同一线程调用这两个函数。如果您打算FunctionTwo阻塞直到FunctionOne完成,则在同一个线程中调用它是错误的。如果lua_performcalc最终调用FunctionTwo,则会发生这种情况。这将是它们可以在同一线程上调用的唯一方式。
如果是这样,请使用recursive_mutex。常规mutex只能锁定一次;从同一线程再次锁定会导致错误。recursive_mutex可以被单个线程多次锁定,并在线程调用相同的unlock数量时锁定。
在任何情况下,请避免显式调用lock和unlock。如果抛出异常,则mutex不会被解锁。最好使用RAII式锁定,如下所示:
{ boost::recursive_mutex::scoped_lock lock(mutex); ...critical section code... // mutex is unlocked when 'lock' goes out of scope }