欢迎光临散文网 会员登陆 & 注册

c++多个线程函数对同一变量操作,如何枷锁

2023-04-04 10:45 作者:大衣哥编程  | 我要投稿
  • 每个线程用不同的线程函数
    例如:
    std::mutex mutex_;
    void func1()
    {
        std::cout << "func1" << std::endl;
        std::lock_guard<std::mutex> lck(mutex_);
        std::this_thread::sleep_for(std::chrono::seconds(7));
        std::cout << "func1 end" << std::endl;
    }

    void func2()
    {
        std::cout << "func2" << std::endl;
        std::lock_guard<std::mutex> lck(mutex_);
        std::cout << "func2 coming" << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(3));
        std::cout << "func2 end" << std::endl;
    }

    int main()
    {
        std::thread t1(func1);
        std::this_thread::sleep_for(std::chrono::seconds(2));
        std::thread t2(func2);
        std::this_thread::sleep_for(std::chrono::seconds(15));
    }
    由于我们在定义t1线程后,休眠了2秒,则基本可以保证:func1函数 执行到定义锁且到了睡眠7秒的地方了,此时线程2才开始,
    由于线程1先获取到锁且睡眠7秒,因此:线程2必须等7秒后才能输出 func2 coming

  • 多个线程公用一个线程函数

    int counter = 0;
    void increase(int count) {
        for (size_t i = 0; i < count; i++)
        {
            /*std::lock_guard<std::mutex> lck(mutex_);*/
            std::this_thread::sleep_for(std::chrono::milliseconds(1));
            counter++;
        }
    }

    测试:std::thread t1(increase, 5000);
        std::thread t2(increase, 5000);
        t1.join();
        t2.join();
        std::this_thread::sleep_for(std::chrono::seconds(5));
        std::cout << "counter:" << counter << std::endl;

    结果:counter值并不是10000,说明了2个线程函数执行时有对同counter变量修改存在问题,执行3次结果都不同:

于是:通过枷锁,来实现互斥访问:
for (size_t i = 0; i < count; i++)
    {
        std::lock_guard<std::mutex> lck(mutex_);
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
        counter++;
    }执行3次结果如下,均为10000:

当然了,也可以在2个线程函数里执行,枷锁后效果一样的。

c++多个线程函数对同一变量操作,如何枷锁的评论 (共 条)

分享到微博请遵守国家法律