栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

stdthread(6)并发mutex

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

stdthread(6)并发mutex

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

1.1 C++11四种互斥量

std::mutex,最常用,普遍的互斥量(默认属性),独占式互斥量

std::recursive_mutex ,允许同一线程使用recursive_mutext多次加锁,然后使用相同次数的解锁操作解锁(mutex多次加锁会造成死锁)

std::timed_mutex,允许超时的独占式互斥量,在mutex上增加了时间的属性。增加了两个成员函数try_lock_for(),try_lock_until(),分别接收一个时间范围,再给定的时间内如果互斥量被锁主了,线程阻塞,超过时间,返回false。

std::recursive_timed_mutex,允许超时的递归式互斥量,增加递归和时间属性

1.2 函数

lock(),互斥量加锁,如果互斥量已被加锁,线程阻塞bool try_lock(),尝试加锁,如果互斥量未被加锁,则执行加锁操作,返回true;如果互斥量已被加锁,返回false,线程不阻塞。void unlock(),解锁互斥量

2. 例子

int cnt = 20;
    std::mutex m;
    void t1()
    {
        while (cnt > 0)
        {     
            m.lock();
            if (cnt > 0)
            {
                //sleep(1);
                --cnt;
                std::cout << "t1 " << cnt << std::endl;
            }
            m.unlock();            
        }
    }
    void t2()
    {
        while (cnt > 0)
        {
            m.lock();
            if (cnt > 0)
            {
                --cnt;
                std::cout << "t2 " << cnt << std::endl;
            }
            m.unlock();
        }
    }
    
    int test(void)
    {
        std::thread th1(t1);
        std::thread th2(t2);
    
        th1.join();    //等待t1退出
        th2.join();    //等待t2退出
    
        std::cout << "test" << std::endl;
    
        return 0;
    } 

输出结果会有多种,但cnt是依次递减的

t1 19
t1 18
t1 17
t1 16
t1 15
t1 14
t1 13
t1 12
t1 11
t1 10
t1 9
t1 8
t1 7
t2 6
t2 5
t2 4
t2 3
t2 2
t2 1
t2 0
mutex test

或

t1 19
t1 18
t1 17
t1 16
t1 15
t1 14
t1 13
t1 12
t1 11
t1 10
t1 9
t1 8
t1 7
t1 6
t1 5
t1 4
t1 3
t1 2
t1 1
t1 0
mutex test
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/784481.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号