互斥锁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& ...
随机推荐
- Extjs Ext.ux.IFrame的用法 以及父子窗口间函数相互调用
Extjs Ext.ux.IFrame的用法 以及父子窗口间函数相互调用 Ext.ux.IFrame Extjs官方提供的一个组件,可以很方便的使用. 这样就完成了一个简单的IFrame的使用,通过E ...
- KMP算法匹配原理以及C++实现
原创作品,转载请注明出处:点我 假设A表示目标字符串,A="abababaababacb",B表示匹配模式,B="ababacb" 用两个指针i和j分别表示,A ...
- js 区分 safari chrome iso
网上有很多这个文章的代码,但是在区分safari chrome 没有很好的例子,因为chrome包含了 safari 毕竟他们都是wekit内核,不过利用jquery还是能区分的 在这里分享下吧 -- ...
- java- Servlet-session
Servlet 相关:http://blog.csdn.net/ggGavin/article/category/2134213 Servlet——Session(1)之基础知识 Servlet——S ...
- 一个残酷的生鲜O2O之梦
三个年轻人,毕业一年,上海浦东张江开了一家生态有机蔬菜店-稻香麦甜. 首先,这不是一个关于成功励志的故事,相反的,我们走向了悬崖.经营2个月,最终以签字转让结束了实体店. 准备阶段 我,首先辞职,那时 ...
- C# json字符串格式
[{\"MenId\":\"1\",\"MenName\":\"内容管理\",\"ParentId\" ...
- sparkR could not find function "textFile"
Yeah, that’s probably because the head() you’re invoking there is defined for SparkR DataFrames[1] ( ...
- 15 款优化表单的 jQuery 插件
网页上的表单提供给用户的一种交互的方式,用户输入数据,提交到服务器,等待后续的处理.这些表单在我们浏览的网页中随处可见,也容易被我们忽略. 比如,“联系我们”页面会提供一个表单给用户填写他们的信息和想 ...
- 关于Nginx里面的配置文件里面的location参数的意思
location是指当遇到这个单词的时候,把root改成大括号里面的值,再把单词和后面的路径加上root变成总的文件路径进行搜索,如果没有location,直接把root加上域名后面的路径变成总的文件 ...
- 图像处理之3d算法----2d转3d算法介绍
http://www.3dov.cn/html/c/37/index.html http://news.ifeng.com/a/20151117/46275220_0.shtml 磁力矩阵 http: ...