美文网首页
多线程--mutex、原子操作、读写锁

多线程--mutex、原子操作、读写锁

作者: d9e7e8498548 | 来源:发表于2020-11-01 21:39 被阅读0次

2. 多线程i++(不加锁、mutex、原子操作)

  • 不加锁

    #include <thread>
    #include <windows.h>
    
    using namespace std;
    
    unsigned long int g_cnt = 0;
    
    void FuncA()
    {
        for (int i = 0; i < 10; ++i) {
            g_cnt++;
            cout << "cnt = " << g_cnt << endl;
            // Sleep(10);
        }
    }
    
    void FuncB()
    {
        for (int i = 0; i < 10; ++i) {
            g_cnt++;
            cout << "cnt = " << g_cnt << endl;
            // Sleep(5);
        }
    }
    
    int main()
    {
        thread t1(FuncA);
        thread t2(FuncB);
        // t1.join();
        // t2.join();
        t1.detach();
        t2.detach();
        cout << "cnt = " << g_cnt << endl;
        // Sleep(1000);
        system("pause");
        return 0;
    }
    
  • mutex

    #include <thread>
    #include <windows.h>
    #include <mutex>
    
    using namespace std;
    
    unsigned long int g_cnt = 0;
    mutex mt; // 线程互斥对象
    
    void FuncA()
    {
        for (int i = 0; i < 10; ++i) {
            std::lock_guard<std::mutex> lockGuard(mt);
            // mt.lock();
            g_cnt++;
            cout << "cnt = " << g_cnt << endl;
            // Sleep(10);
            // mt.unlock();
        }
    }
    
    void FuncB()
    {
        for (int i = 0; i < 10; ++i) {
            std::lock_guard<std::mutex> lockGuard(mt);
            // mt.lock();
            g_cnt++;
            cout << "cnt = " << g_cnt << endl;
            // Sleep(5);
            // mt.unlock();
        }
    }
    
    int main()
    {
        thread t1(FuncA);
        thread t2(FuncB);
        // t1.join();
        // t2.join();
        t1.detach();
        t2.detach();
        cout << "cnt = " << g_cnt << endl;
        // Sleep(1000);
        system("pause");
        return 0;
    }
    

    mutex是用来保证线程同步的,防止不同的线程同时操作同一个共享数据。

    但使用lock_guard则相对安全,它是基于作用域的,能够自解锁,当该对象创建时,它会像m.lock()一样获得互斥锁,当生命周期结束时,它会自动析构(unlock),不会因为某个线程异常退出而影响其他线程。

  • 原子操作

    在C++11中,实现了原子操作的数据类型(atomic_bool,atomic_int,atomic_long等等),对于这些原子数据类型的共享资源的访问,无需借助mutex等锁机制,也能够实现对共享资源的正确访问。

#include <thread>
#include <windows.h>
#include <atomic>

using namespace std;

// unsigned long int g_cnt = 0;
atomic_long g_cnt;

void FuncA()
{
    for (int i = 0; i < 10; ++i) {
        g_cnt++;
        cout << "cnt = " << g_cnt << endl;
        // Sleep(10);
    }
}

void FuncB()
{
    for (int i = 0; i < 10; ++i) {
        g_cnt++;
        cout << "cnt = " << g_cnt << endl;
        // Sleep(5);
    }
}

int main()
{
    thread t1(FuncA);
    thread t2(FuncB);
    // t1.join();
    // t2.join();
    t1.detach();
    t2.detach();
    cout << "cnt = " << g_cnt << endl;
    // Sleep(1000);
    system("pause");
    return 0;
}

参考:

  1. linux的<pthread.h>
  2. C++使用thread类多线程编程
  3. C++ thread用法总结(整理)
  4. C++11中的原子操作(atomic operation)
  5. Linux C++实现多线程同步的四种方式

3. 实现一个读写锁

4. 基于面向对象的思想,实现多线程队列类(基类和子类)

相关文章

  • 多线程--mutex、原子操作、读写锁

    2. 多线程i++(不加锁、mutex、原子操作) 不加锁#include #include

  • 生产者消费者中条件变量的使用

    使用的层次说明 多线程同步互斥锁mutex,lock_guard和unique_lock用法原子操作...

  • golang rwmutex的实现原理

    1. 前言 前面我们聊了互斥锁Mutex,所谓读写锁RWMutex,完整的表述应该是读写互斥锁,可以说是Mutex...

  • 减小锁的持有时间 减小锁的粒度 读写分离 使用原子操作

  • Linux中的各种锁

    在Linux内核中,有很多同步机制。比较经典的有原子操作、spin_lock(忙等待的锁)、mutex(互斥锁)、...

  • Go 语言的锁

    Go 语言提供两类锁: 互斥锁(Mutex)和读写锁(RWMutex)。其中读写锁(RWMutex)是基于互斥锁(...

  • Linux内核设计与实现——内核同步方法

    主要内容 原子操作 自旋锁 读写自旋锁 信号量 读写信号量 互斥锁 完成变量 大内核锁 顺序锁 禁止抢占 顺序和屏...

  • mysql锁机制与事务

    概念 事务是一系列操作所构成的执行单元,具有原子性,隔离性等的特点。锁是为了防止多线程读写操作的并发问题而引入的解...

  • go之channel

    channel channel的实现相对map简单了不少,通过锁mutex来保证并发安全,同时只提供读写和关闭操作...

  • 2020-07-24

    锁 OSSpinLock 自旋锁 实现机制:忙等 操作重点:原子操作1.自旋锁2.互斥锁3.读写锁4.信号量5.条...

网友评论

      本文标题:多线程--mutex、原子操作、读写锁

      本文链接:https://www.haomeiwen.com/subject/ibiuvktx.html