C++11多线程编程-两个进程轮流打印1~100

本文详细介绍了如何使用C++11的互斥锁和条件变量解决经典同步问题,通过例子展示了如何确保线程安全地交替打印奇数和偶数。使用了`std::mutex`, `std::condition_variable`, 和lambda表达式来管理线程间的协调和唤醒。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是经典的同步互斥问题,

遵循原则:

1、条件变量需要锁的保护;
2、锁需要条件变量成立后,后重新上锁;

参考代码:

复制代码

//notify_one()(随机唤醒一个等待的线程)
//notify_all()(唤醒所有等待的线程)
//Create By@herongwei 2019/09/10

#include <bits/stdc++.h>
#include <mutex>
#include <thread>
#include <condition_variable>
using namespace std;

std::mutex data_mutex;//互斥锁
std::condition_variable data_var;//条件变量
bool flag = true;
void printfA() {
    int i = 1;
    while(i <= 100) {
        //休息1秒
        //std::this_thread::sleep_for(std::chrono::seconds(1));
        std::unique_lock<std::mutex> lck(data_mutex);
        data_var.wait(lck,[]{return flag;});//等待flag=true才打印奇数
        std::cout<<"A " << i <<endl;
        i += 2;
        flag = false;
        data_var.notify_one();
    }
}

void printfB() {
    int i = 2;
    while(i <= 100) {
        std::unique_lock<std::mutex> lck(data_mutex);
        data_var.wait(lck,[]{return !flag;});//等待flag=false才打印偶数
        std::cout<<"B " << i <<endl;
        i += 2;
        flag = true;
        data_var.notify_one();
    }
}
int main() {
    // freopen("in.txt","r",stdin);
    std::thread tA(printfA);
    std::thread tB(printfB);
    tA.join();
    tB.join();
    return 0;
}

 

思路2:
C++ 11,VS2019
使用了unique_lock,条件变量
条件变量的wait(), notify_one()
wait()中使用了lambda表达式
代码
#include <iostream>
#include <vector>
#include <thread>
#include <list>
#include <mutex>

using namespace std;

bool flag = true;

class A
{
public:

    void print1()
    {
        while (true)
        {
            std::unique_lock<std::mutex> lock1(print_mutex);
            data_var.wait(lock1, [] {return flag; });
            cout << "thread: " << std::this_thread::get_id() << " print: " << "A" << endl;

            flag = false;
            data_var.notify_one();
        }
    }

    void print2()
    {
        while (true)
        {
            std::this_thread::sleep_for(std::chrono::seconds(1));

            std::unique_lock<std::mutex> lock2(print_mutex);

            data_var.wait(lock2, [] {return !flag; });
            cout << "thread: " << std::this_thread::get_id() << " print: " << "B" << endl;

            flag = true;
            data_var.notify_one();
        }
    }

private:

    std::mutex print_mutex;
    std::condition_variable data_var;
};


int main()
{
    A myobj_a;

    std::thread print1(&A::print1, &myobj_a);
    std::thread print2(&A::print2, &myobj_a);

    print1.join();
    print2.join();

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值