C++ Mutex lock2次,第二次仍能加上。

shizheng163 2018-10-24 04:13:03
#include <iostream>
#include <mutex>
using namespace std;

static std::mutex gMutex;

int main(/*int argc, char *argv[]*/)
{
gMutex.lock();
gMutex.lock();
std::cout << "hello, world" << std::endl;
gMutex.unlock();
gMutex.unlock();
return 0;
}

以上代码输出hello,world.
环境:ubuntu16.04, gcc-5.4.
哪位大牛给解释一下。
另外在发现C++11中,关于std::mutex和std::recursive_mutex的lock的调用过程其实是一样的,这个怎么解释。
std::mutex,lock

void
lock()
{
int __e = __gthread_mutex_lock(&_M_mutex);

// EINVAL, EAGAIN, EBUSY, EINVAL, EDEADLK(may)
if (__e)
__throw_system_error(__e);
}


std::recursive_mutex,lock

void
lock()
{
int __e = __gthread_recursive_mutex_lock(&_M_mutex);

// EINVAL, EAGAIN, EBUSY, EINVAL, EDEADLK(may)
if (__e)
__throw_system_error(__e);
}


__gthread_recursive_mutex_lock 实现中调用的函数和std::mutex中调用的函数是一样的。

static inline int
__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex)
{
return __gthread_mutex_lock (__mutex);
}
...全文
466 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
shizheng163 2018-10-24
  • 打赏
  • 举报
回复
引用 5 楼 smwhotjay的回复:
你可以lock2次 因为是嵌套锁
我声明的是非递归锁啊,可以lock两次是因为只有一个线程吧?
smwhotjay 2018-10-24
  • 打赏
  • 举报
回复
你可以lock2次 因为是嵌套锁
smwhotjay 2018-10-24
  • 打赏
  • 举报
回复

pthread_mutexattr_settype(&m_attr, PTHREAD_MUTEX_RECURSIVE_NP);//嵌套锁

PTHREAD_MUTEX_TIMED_NP 普通锁.不支持嵌套...
shizheng163 2018-10-24
  • 打赏
  • 举报
回复
测试过了,锁应该是在多线程的情况的下才起作用。但是递归锁和非递归的区别还不清楚。
shizheng163 2018-10-24
  • 打赏
  • 举报
回复
引用 1 楼 linfengc的回复:
说明std::mutex和std::recursive_mutex本质就是同一个东西
那递归锁底层是怎么判断实现的?我没看过pthread的源码
linfengc 2018-10-24
  • 打赏
  • 举报
回复
说明std::mutex和std::recursive_mutex本质就是同一个东西

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧