• 静态锁问题


    在类中声明了静态成员变量锁后,相当于定义了该类的全局锁,该类的每一个对象这个锁都有效,共用同一个锁。如例子所示

    (1)仅声明静态锁,不进行调用

    #include "stdafx.h"
    #include "thread"
    #include "iostream"
    #include "mutex"
     
    class Address{
    public:
        static std::mutex grobal_mutex;
        std::mutex mtx;
        Address(int n_):n(n_){}
        int n;
        void add()
        {
            std::unique_lock<std::mutex> ulck(mtx);
            for (int i = 0; i < 1; i++)
            {
                std::cout<< "n = "<< n++ << std::endl;
            }
        }
     
    };
    std::mutex Address::grobal_mutex;
    Address a3(0);
    void func1()
    {
        Address a1(5);
        for (int i = 0; i < 5; i++)
        {
            a1.add();
            std::cout<< "i1 = "<< i << std::endl;
        }
       
    }
    void func2()
    {
        Address a2(10);
        for (int i = 0; i < 5; i++)
        {
            a2.add();
            std::cout<< "i2 = "<< i << std::endl;
        }
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        std::thread th1(func1);
        std::thread th2(func2);
        th1.join();
        th2.join();
        return 0;
    }

    结果:

    n = n = 105
     
    i1 = 0
    i2 = 0
    n = 6
    n = 11
    i2 = 1
    n = 12
    i2 = 2
    n = 13
    i2 = 3
    n = 14
    i2 = 4
    i1 = 1
    n = 7
    i1 = 2
    n = 8
    i1 = 3
    n = 9
    i1 = 4


    从结果可以看出只声明静态锁grobal_mutex并在类外进行内存分配,不进行调用,该静态锁就不会起作用。而且从这个例子中我们可以明显看到非静态锁在两个不同对象调用时,不会起作用。

    (2)声明静态锁并调用它

    #include "stdafx.h"
    #include "thread"
    #include "iostream"
    #include "mutex"
     
    class Address{
    public:
        static std::mutex grobal_mutex;
        std::mutex mtx;
        Address(int n_){}
        static int n;
        static void add()
        {
            std::unique_lock<std::mutex> ulck(grobal_mutex);
            for (int i = 0; i < 1; i++)
            {
                std::cout<< "n = "<< n++ << std::endl;
            }
        }
    };
    int Address::n = 0;
    std::mutex Address::grobal_mutex;
    Address a3(0);
    void func1()
    {
        //std::unique_lock<std::mutex> x(Address::grobal_mutex);
        Address a1(5);
        for (int i = 0; i < 5; i++)
        {
            a3.add();
            std::cout<< "i1 = "<< i << std::endl;
        }
       
    }
    void func2()
    {
        Address a2(10);
        //std::unique_lock<std::mutex> x(a1.grobal_mutex);
        for (int i = 0; i < 5; i++)
        {
            a3.add();
            std::cout<< "i2 = "<< i << std::endl;
        }
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
        std::thread th1(func1);
        std::thread th2(func2);
        th1.join();
        th2.join();
        return 0;
    }

    结果:

    n = n = 105
     
    i1 = 0
    i2 = 0
    n = 6
    n = 11
    i2 = 1
    n = 12
    i2 = 2
    n = 13
    i2 = 3
    n = 14
    i2 = 4
    i1 = 1
    n = 7
    i1 = 2
    n = 8
    i1 = 3
    n = 9
    i1 = 4


  • 相关阅读:
    SOGo 2.0 发布,群组协同工作系统
    微软随.NET 4.5发布新REST API框架
    DynamicReports 3.0.2 发布,Java 报表方案
    使用 Ant 集成 IBM Security AppScan Standard 进行自动测试
    SUSE 用 zypper 工具 安装 rpm
    嵌入式ARM系统中OpenCV的移植
    qtopiax86安装配置及编程方法
    [转]QTCreator的使用
    在Qt Creator中使用OpenCV库
    vim
  • 原文地址:https://www.cnblogs.com/liumantang/p/11830388.html
Copyright © 2020-2023  润新知