互斥锁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& ...
随机推荐
- [Django学习]模型
ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是“对象-关系-映射”的简称 ...
- JavaScriptSerializer 时间格式化
时间格式化 Model m = , Dt = DateTime.Now }; JavaScriptSerializer js = new JavaScriptSerializer(); string ...
- jquery轮播控件
网上找了一个轮播控件,效果不错,而且很容易改,需要的同学去下载咯 地址是:http://download.csdn.net/detail/jine515073/7704143
- Application.idle方法
Application.Idle()方法表示:当应用程序处于空闲状态时执行相应代码. 示例程序 1.界面设计:一个简单的Lable控件 2.代码 using System; using System. ...
- java-基于Servlet3.0的文件上传
Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet3.0中使用request.getParts()获取上传文件
- http://www.casualarena.com/
http://www.casualarena.com/ ———————————————————————————————————————————— 包括祖玛.台球.国际象棋等双人联机小游戏.
- javascript实现记录文本框内文字个数
最近在做一个项目中遇到这样一个问题,要对文本框中用户输入的文字进行记数,在下面显示出来,因为我们做的是一个短信发送平台,现在我们国家的短信服务,如果你的信息超过了70个字符,短信就会按二条给你下发.所 ...
- R语言低级绘图函数-rect
rect 函数用来在一张图上添加矩形,只需要指定左下角和右上角的坐标的位置,就可以画出一个矩形 基本用法: plot(1:5, 1:5, xlim = c(0,6), ylim = c (0,6), ...
- linux下安装dovecot
Dovecot是一个开源的,为Linux/Unix-like系统提供IMAP,POP3服务的软件.主要是为了安全产生的,不管大小应用,Dovecot都是一个非常优秀的选择.它非常快,配置简单,不需要专 ...
- 【Java面试题】1 Java中使用switch-case的用法及注意事项超全总结
今天在用到switch的时候,这种设计到最基本的内容,可能忘记它的一些基本语法,出现了一些错误,所以即兴从各种资料查询总结了下面的内容,希望可以帮助那些正在困扰switch错误和各种细节问题的朋友! ...