zoukankan      html  css  js  c++  java
  • 互斥锁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() 
    ");
        syslog(LOG_DEBUG, "thread Test() 
    ");
        pthread_mutex_unlock(&testlock);
    }
    
    int main()
    {
        openlog("syslog",  LOG_PID, LOG_DAEMON);
        pthread_mutex_init(&testlock, NULL);
        pthread_mutex_lock(&testlock);
    
        printf("Main lock 
    ");
        syslog(LOG_DEBUG, "Main lock 
    ");
        pthread_create(&test_thread, NULL, &test, NULL);
        sleep(3); //更加明显的观察到是否执行了创建线程的互斥锁
        printf("Main unlock 
    ");
        syslog(LOG_DEBUG, "Main unlock 
    ");
        pthread_mutex_unlock(&testlock);
        sleep(1);
        printf("Main after sleep 
    ");
        syslog(LOG_DEBUG, "Main after sleep 
    ");
        pthread_join(test_thread, NULL);
        pthread_mutex_destroy(&testlock);
        closelog();
        return 0;
    }

    小技巧:借助syslog 记录时间  cat /var/log/syslog

    输出:

    Jul  5 16:23:24 Linux syslog[19982]: Main lock
    Jul  5 16:23:27 Linux syslog[19982]: Main unlock
    Jul  5 16:23:27 Linux syslog[19982]: thread Test()
    Jul  5 16:23:28 Linux syslog[19982]: 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() 
    ");
        syslog(LOG_DEBUG, "thread Test() 
    ");
        sleep(2); //更加明显的观察到是否执行了创建线程的互斥锁
        pthread_mutex_unlock(&testlock);
    }
    
    int main()
    {
        openlog("syslog",  LOG_PID, LOG_DAEMON);
        pthread_mutex_init(&testlock, NULL);
        pthread_mutex_lock(&testlock);
    
        printf("Main lock 
    ");
        syslog(LOG_DEBUG, "Main lock 
    ");
        pthread_create(&test_thread, NULL, &test, NULL);
        sleep(3); //更加明显的观察到是否执行了创建线程的互斥锁
        printf("Main unlock 
    ");
        syslog(LOG_DEBUG, "Main unlock 
    ");
        pthread_mutex_unlock(&testlock);
        sleep(1);
        pthread_mutex_lock(&testlock);
        printf("Main after sleep 
    ");
        syslog(LOG_DEBUG, "Main after sleep 
    ");
        pthread_mutex_unlock(&testlock);
        pthread_join(test_thread, NULL);
        pthread_mutex_destroy(&testlock);
        closelog();
        return 0;
    }

    输出为:

    Jul  6 10:31:40 Linux syslog[2498]: Main lock
    Jul  6 10:31:43 Linux syslog[2498]: Main unlock
    Jul  6 10:31:43 Linux syslog[2498]: thread Test()
    Jul  6 10:31:45 Linux syslog[2498]: 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;
            }
  • 相关阅读:
    删除文件时,提示 "操作无法完成..." 怎么处理
    对象的理解
    TP5架构下链接SQL数据库的一种方法
    关于URL隐藏index.php方法
    非典型的千万用户后台之路
    就这样,再见2015
    理想的程序员
    4个小例子告诉你:如何成为一名数据极客
    馆中窥职:小公司没那么糟糕
    JAVA设计模式详解(六)----------状态模式
  • 原文地址:https://www.cnblogs.com/hixin/p/9269048.html
Copyright © 2011-2022 走看看