互斥锁mutex
https://blog.csdn.net/rqc112233/article/details/50015069
//g++ mute.cpp -o mute -g -lrt -lpthread
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <syslog.h> static pthread_mutex_t testlock;
pthread_t test_thread; void *test(void *)
{
pthread_mutex_lock(&testlock);
printf("thread Test() \n");
syslog(LOG_DEBUG, "thread Test() \n");
pthread_mutex_unlock(&testlock);
} int main()
{
openlog("syslog", LOG_PID, LOG_DAEMON);
pthread_mutex_init(&testlock, NULL);
pthread_mutex_lock(&testlock); printf("Main lock \n");
syslog(LOG_DEBUG, "Main lock \n");
pthread_create(&test_thread, NULL, &test, NULL);
sleep(); //更加明显的观察到是否执行了创建线程的互斥锁
printf("Main unlock \n");
syslog(LOG_DEBUG, "Main unlock \n");
pthread_mutex_unlock(&testlock);
sleep();
printf("Main after sleep \n");
syslog(LOG_DEBUG, "Main after sleep \n");
pthread_join(test_thread, NULL);
pthread_mutex_destroy(&testlock);
closelog();
return ;
}
小技巧:借助syslog 记录时间 cat /var/log/syslog
输出:
Jul :: Linux syslog[]: Main lock
Jul :: Linux syslog[]: Main unlock
Jul :: Linux syslog[]: thread Test()
Jul :: Linux syslog[]: Main after sleep
稍微改下:
//g++ mute.cpp -o mute -g -lrt -lpthread
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <syslog.h> static pthread_mutex_t testlock;
pthread_t test_thread; void *test(void *)
{
pthread_mutex_lock(&testlock);
printf("thread Test() \n");
syslog(LOG_DEBUG, "thread Test() \n");
sleep(); //更加明显的观察到是否执行了创建线程的互斥锁
pthread_mutex_unlock(&testlock);
} int main()
{
openlog("syslog", LOG_PID, LOG_DAEMON);
pthread_mutex_init(&testlock, NULL);
pthread_mutex_lock(&testlock); printf("Main lock \n");
syslog(LOG_DEBUG, "Main lock \n");
pthread_create(&test_thread, NULL, &test, NULL);
sleep(); //更加明显的观察到是否执行了创建线程的互斥锁
printf("Main unlock \n");
syslog(LOG_DEBUG, "Main unlock \n");
pthread_mutex_unlock(&testlock);
sleep();
pthread_mutex_lock(&testlock);
printf("Main after sleep \n");
syslog(LOG_DEBUG, "Main after sleep \n");
pthread_mutex_unlock(&testlock);
pthread_join(test_thread, NULL);
pthread_mutex_destroy(&testlock);
closelog();
return ;
}
输出为:
Jul :: Linux syslog[]: Main lock
Jul :: Linux syslog[]: Main unlock
Jul :: Linux syslog[]: thread Test()
Jul :: Linux syslog[]: Main after sleep
主线程初始化互斥锁和上锁, 然后创建子线程, sleep 3s,
子线程会卡在pthread_mutex_lock(&testlock);直到主线程解锁
主线程解锁后, 子线程持有锁, sleep 2s , 主线程sleep 1s,
主线程会卡在pthread_mutex_lock(&testlock);直到子线程解锁
阻塞的方式等待子线程结束.销毁锁
JAVA版本:
public boolean waitDone() {
final Object waitDoneLock = new Object();
final Runnable unlockRunnable = new Runnable() {
@Override
public void run() {
synchronized (waitDoneLock) {
waitDoneLock.notifyAll();
}
}
};
synchronized (waitDoneLock) {
mCameraHandler.post(unlockRunnable);
try {
waitDoneLock.wait();
} catch (InterruptedException ex) {
QLog.v(TAG, "waitDone interrupted");
return false;
}
}
return true;
}
public boolean waitDone(long timeout) {
final Object waitDoneLock = new Object();
final Runnable unlockRunnable = new Runnable() {
@Override
public void run() {
synchronized (waitDoneLock) {
waitDoneLock.notifyAll();
}
}
};
synchronized (waitDoneLock) {
mCameraHandler.post(unlockRunnable);
try {
waitDoneLock.wait(timeout);
mCameraHandler.removeCallbacks(unlockRunnable);
} catch (InterruptedException ex) {
QLog.v(TAG, "waitDone interrupted");
return false;
}
}
return true;
}
互斥锁mutex的更多相关文章
- 互斥锁Mutex与信号量Semaphore的区别
转自互斥锁Mutex与信号量Semaphore的区别 多线程编程中,常常会遇到这两个概念:Mutex和Semaphore,两者之间区别如下: 有人做过如下类比: Mutex是一把钥匙,一个人拿了就可进 ...
- 深入理解Solaris内核中互斥锁(mutex)与条件变量(condvar)之协同工作原理
在Solaris上写内核模块总是会用到互斥锁(mutex)与条件变量(condvar), 光阴荏苒日月如梭弹指一挥间,Solaris的大船说沉就要沉了,此刻心情不是太好(Orz).每次被年轻的有才华的 ...
- Linux内核互斥锁--mutex
一.定义: /linux/include/linux/mutex.h 二.作用及访问规则: 互斥锁主要用于实现内核中的互斥访问功能.内核互斥锁是在原子 API 之上实现的,但这对于内核用户是不可见 ...
- 线程锁(互斥锁Mutex)及递归锁
一.线程锁(互斥锁) 在一个程序内,主进程可以启动很多个线程,这些线程都可以访问主进程的内存空间,在Python中虽然有了GIL,同一时间只有一个线程在运行,可是这些线程的调度都归系统,操作系统有自身 ...
- 线程锁(互斥锁Mutex)
线程锁(互斥锁Mutex) 一个进程下可以启动多个线程,多个线程共享父进程的内存空间,也就意味着每个线程可以访问同一份数据,此时,如果2个线程同时要修改同一份数据,会出现什么状况? # -*- cod ...
- Golang 读写锁RWMutex 互斥锁Mutex 源码详解
前言 Golang中有两种类型的锁,Mutex (互斥锁)和RWMutex(读写锁)对于这两种锁的使用这里就不多说了,本文主要侧重于从源码的角度分析这两种锁的具体实现. 引子问题 我一般喜欢带着问题去 ...
- 一文带你剖析LiteOS互斥锁Mutex源代码
摘要:多任务环境下会存在多个任务访问同一公共资源的场景,而有些公共资源是非共享的临界资源,只能被独占使用.LiteOS使用互斥锁来避免这种冲突,互斥锁是一种特殊的二值性信号量,用于实现对临界资源的独占 ...
- [Go] golang互斥锁mutex
1.互斥锁用于在代码上创建一个临界区,保证同一时间只有一个goroutine可以执行这个临界区代码2.Lock()和Unlock()定义临界区 package main import ( " ...
- Go基础系列:互斥锁Mutex和读写锁RWMutex用法详述
sync.Mutex Go中使用sync.Mutex类型实现mutex(排他锁.互斥锁).在源代码的sync/mutex.go文件中,有如下定义: // A Mutex is a mutual exc ...
- go互斥锁Mutex
go mutex是互斥锁,只有Lock和Unlock两个方法,在这两个方法之间的代码不能被多个goroutins同时调用到. 看代码: package main import ( "fmt& ...
随机推荐
- 利用MapReduce实现倒排索引
这里来学习的是利用MapReduce的分布式编程模型来实现简单的倒排索引. 首先什么是倒排索引? 倒排索引是文档检索中最常用的数据结构,被广泛地应用于全文搜索引擎. 它主要是用来存储某个单词(或词组) ...
- git commit 多行注释方法说明
为了提高项目质量,不仅仅是代码的质量,而且还包括代码管理的质量. 所以,详细的git commit message 必不可少. 现在记录一下git commit 多行详细的commit 信息. 首先, ...
- Window 2008 R2组策略之一——组策略管理控制台
组策略管理在windows域管理中占有重要地位,本身也不是新的内容了.但微软在Windows2008中终于集成了一个非常好用的组策略管理工具——组策略管理控制台.并且为原有的组策略添加了新的元素.本文 ...
- div绝对定位针对手机浏览器的区别
最近在对ipad和安卓平板做测试,发现我自己写的一个下拉控件在安卓浏览器里面被遮盖了,但是PC或者ipad都没有这个现象,一开始以为是z-index 可是无论我调多少都没有用,研究了好久,发现是代码的 ...
- Qt 反射
简介 本文主要讲解Qt是如何实现反射,以及一点点反射使用的小心得. 文章概览 Qt反射内幕小窥 详细内容 反射前期准备 得到注册的类成员变量 得到注册的类成员函数 访问类成员属性(get,set) 调 ...
- Hbase导入MapReduce数据的时候提示Running Job XXXX后就一直卡着不动
代码确信无误之后,ant运行起来,发现一执行就卡在Running Job XXXX那里一直不动了. 试着把代码打包成jar扔到Linux执行也还是一样的效果.还是停在那里.然后就一顿瞎蒙.最后发现是H ...
- Ubuntu 12.04 root用户登录设置
Ubuntu 12.04默认是不允许root登录的,在登录窗口只能看到普通用户和访客登录.以普通身份登陆Ubuntu后我们需要做一些修改,普通用户登录后,修改系统配置文件需要切换到超级用户模式,在终端 ...
- CentOS命令top下你不一定懂的cpu显示信息
在使用top命令的时候会看到这么一行: 里面的各个值分别是什么意思呢? 今天被问到这个问题,发现答的不是很清楚.果然啊,天天用最多的top命令都还没摸透...惭愧...于是就查了些资料: 官方解释 C ...
- Session超时问题(AOP 过滤器)
public class TimeoutAttribute : ActionFilterAttribute { public override void OnActionExecuting(Actio ...
- Spring-注入外部值
Spring注入需要初始化,但前面均使用硬编码注入,如: JavaConfig配置: package soundSystem; import org.springframework.stereotyp ...