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的更多相关文章

  1. 互斥锁Mutex与信号量Semaphore的区别

    转自互斥锁Mutex与信号量Semaphore的区别 多线程编程中,常常会遇到这两个概念:Mutex和Semaphore,两者之间区别如下: 有人做过如下类比: Mutex是一把钥匙,一个人拿了就可进 ...

  2. 深入理解Solaris内核中互斥锁(mutex)与条件变量(condvar)之协同工作原理

    在Solaris上写内核模块总是会用到互斥锁(mutex)与条件变量(condvar), 光阴荏苒日月如梭弹指一挥间,Solaris的大船说沉就要沉了,此刻心情不是太好(Orz).每次被年轻的有才华的 ...

  3. Linux内核互斥锁--mutex

    一.定义: /linux/include/linux/mutex.h   二.作用及访问规则: 互斥锁主要用于实现内核中的互斥访问功能.内核互斥锁是在原子 API 之上实现的,但这对于内核用户是不可见 ...

  4. 线程锁(互斥锁Mutex)及递归锁

    一.线程锁(互斥锁) 在一个程序内,主进程可以启动很多个线程,这些线程都可以访问主进程的内存空间,在Python中虽然有了GIL,同一时间只有一个线程在运行,可是这些线程的调度都归系统,操作系统有自身 ...

  5. 线程锁(互斥锁Mutex)

    线程锁(互斥锁Mutex) 一个进程下可以启动多个线程,多个线程共享父进程的内存空间,也就意味着每个线程可以访问同一份数据,此时,如果2个线程同时要修改同一份数据,会出现什么状况? # -*- cod ...

  6. Golang 读写锁RWMutex 互斥锁Mutex 源码详解

    前言 Golang中有两种类型的锁,Mutex (互斥锁)和RWMutex(读写锁)对于这两种锁的使用这里就不多说了,本文主要侧重于从源码的角度分析这两种锁的具体实现. 引子问题 我一般喜欢带着问题去 ...

  7. 一文带你剖析LiteOS互斥锁Mutex源代码

    摘要:多任务环境下会存在多个任务访问同一公共资源的场景,而有些公共资源是非共享的临界资源,只能被独占使用.LiteOS使用互斥锁来避免这种冲突,互斥锁是一种特殊的二值性信号量,用于实现对临界资源的独占 ...

  8. [Go] golang互斥锁mutex

    1.互斥锁用于在代码上创建一个临界区,保证同一时间只有一个goroutine可以执行这个临界区代码2.Lock()和Unlock()定义临界区 package main import ( " ...

  9. Go基础系列:互斥锁Mutex和读写锁RWMutex用法详述

    sync.Mutex Go中使用sync.Mutex类型实现mutex(排他锁.互斥锁).在源代码的sync/mutex.go文件中,有如下定义: // A Mutex is a mutual exc ...

  10. go互斥锁Mutex

    go mutex是互斥锁,只有Lock和Unlock两个方法,在这两个方法之间的代码不能被多个goroutins同时调用到. 看代码: package main import ( "fmt& ...

随机推荐

  1. 基于HTML5/CSS3图片网格动画特效

    现在HTML5技术可以让网页上的图片变得非常神奇,各种各样的HTML5图片动画特效让你眼花缭乱.今天要分享的这款HTML5图片网格动画特效就非常炫酷.图片缩略图按网格的布局一行行排列,你只需点击按钮即 ...

  2. CenOS6.5下源码安装vim-7.4

    1.[下载] vim-7.4下载地址: ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2 2.[解压] tar jxvf vim-7.4.tar.bz2 之 ...

  3. Apache HttpComponents 文件上传例子

    /* * ==================================================================== * * Licensed to the Apache ...

  4. Android——进度条控制图片透明度

    xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...

  5. Spark MLlib回归算法------线性回归、逻辑回归、SVM和ALS

    Spark MLlib回归算法------线性回归.逻辑回归.SVM和ALS 1.线性回归: (1)模型的建立: 回归正则化方法(Lasso,Ridge和ElasticNet)在高维和数据集变量之间多 ...

  6. pku1204 Word Puzzles AC自动机 二维字符串矩阵8个方向找模式串的起点坐标以及方向 挺好的!

    /** 题目:pku1204 Word Puzzles 链接:http://poj.org/problem?id=1204 题意:给定一个L C(C <= 1000, L <= 1000) ...

  7. rufus/scheduler

    之前先在initializers 文件夹下建立了一个task.rb ,rails服务启动的时候执行,本地没问题,可是服务器上启动了3个进程,会执行3遍,解决方法是 把task.rb 放到 script ...

  8. EasyUI的treegrid组件动态加载数据问题的解决办法

    http://www.jquerycn.cn/a_3455 —————————————————————————————————————————————————————————————————————— ...

  9. Laravel 多where组合

    $model=DB::table("user"); foreach($request as $value){ if($value->name){ $model->whe ...

  10. MySql C++调用库Connector/c++编译 和 接口封装【一】mysql数据库安装

    Connector/c++库的源文件编译,你需要先准备好以下工具:     mysql数据库(编译时要依赖),boost库,cmake(生成sln工程文件),connector/c++的源文件,vis ...