c++多线程(二)互斥量

一、简介

互斥量是一种同步原语,是一种线程同步的手段,用来保护多线程同时访问的共享数据.

  • std::mutex: 独占的互斥量,不能递归使用.

  • std::timed_mutex: 带超时的独占互斥量,不能递归使用.

  • std::recursive_mutex: 递归互斥量,不带超时功能.

  • std::recursive_timed_mutex: 带超时的递归互斥量.

这些互斥量的基本接口十分相近,都是通过lock()来阻塞线程,直到获得互斥量的所有权为止.在线程或的互斥量并完成任务后,就必须使用unlock()来解除对互斥量的占用,lock和unlock必须成对出现.try_lock()尝试锁定互斥量,成功返回true,失败返回false,他是非阻塞的.

二、示例

示例包括:
1、使用lock加锁和unlock解锁
2、使用lock_guard:用到了RAII的技术,这种技术在类的构造函数中分配资源,在析构函数中释放资源,保证资源在出了作用域之后就释放。

#include "stdafx.h"

static std::mutex g_lock;

void lock_unlock()
{
    //上锁
    g_lock.lock();
    cout << "in id: " << this_thread::get_id() << endl;
    this_thread::sleep_for(chrono::seconds(1));
    cout << "out id: " << this_thread::get_id() << endl;
    //解锁
    g_lock.unlock();
}

void f_lock_guard()
{
    //lock_guard在构造时会自动锁定互斥量,而在退出作用域后进行析构时就会自动解锁.
    lock_guard<std::mutex> lock(g_lock);
    cout << "in id: " << this_thread::get_id() << endl;
    this_thread::sleep_for(chrono::seconds(1));
    cout << "out id: " << this_thread::get_id() << endl;
}

int mutex_demo()
{
    std::thread t1(lock_unlock);
    std::thread t2(lock_unlock);
    std::thread t3(lock_unlock);

    t1.join();
    t2.join();
    t3.join();

    std::thread t4(f_lock_guard);
    std::thread t5(f_lock_guard);
    std::thread t6(f_lock_guard);

    t4.join();
    t5.join();
    t6.join();

    return 0;
}

你可能感兴趣的:(c++,多进程与多线程)