03-C++多线程编程-多线程的数据共享

什么数据是安全的?
只读数据是安全的。

什么数据是不安全的?
同一个地址数据有读有写,如果不做处理,容易冲突崩溃。

互斥量 mutex
互斥量就是一个类对象,多个线程同一时间只能一个线程能加锁或解锁。

/**
 * By kkmd66
 * 
 * 理论学习
 * 1、代码锁住共享数据后,其他操作共享数据的会锁住,等待解锁
 * 2、锁的生命周期,注意范围
 *
 * 代码演示:
 * 1、保护共享数据
 * 2、函数,类成员函数创建线程
 */

#include <iostream>
//多线程的头文件
#include "thread"
#include "list"
//互斥锁的头文件
#include "mutex"

using namespace std;

//设置模式
#define THREAD_BY_FUNCTION
#define THREAD_BY_CLASS
#define USE_MUTEX

#ifdef THREAD_BY_FUNCTION
//函数创建进程
std::list<int> dataQuene;
std::mutex myMutex;

void putInData() {

    //数字增大可增加冲突概率
    for (int i = 0; i < 1000; ++i) {
#ifdef USE_MUTEX
        myMutex.lock();
        cout << "putInData 子线程:放入一个数据" << i << endl;
        dataQuene.push_back(i);
        myMutex.unlock();
#else
        cout << "putInData 子线程:放入一个数据" << i << endl;
        dataQuene.push_back(i);
#endif
    }
}

void takeOutData() {
    //会导致不能完全取出所有数据
//    for (int i = 0; i < 100; ++i)
    while (1) {
        if (!dataQuene.empty()) {
#ifdef USE_MUTEX
            myMutex.lock();
            cout << "takeOutData 子线程:取出一个数据" << dataQuene.front() << endl;
            dataQuene.pop_front();
            myMutex.unlock();
#else
            cout << "takeOutData 子线程:取出一个数据" << dataQuene.front() << endl;
            dataQuene.pop_front();
#endif
        } else {
//            std::this_thread::sleep_for(std::chrono::milliseconds(1));
        }
    }
}

#endif

#ifdef THREAD_BY_CLASS

//类成员函数创建线程
class DealData {

public:
    void putInData() {
        for (int i = 0; i < 100; ++i) {
#ifdef USE_MUTEX
            myMutex.lock();
            cout << "putInData 子线程:放入一个数据" << i << endl;
            dataQuene.push_back(i);
            myMutex.unlock();
#else
            cout << "putInData 子线程:放入一个数据" << i <<endl;
            dataQuene.push_back(i);
#endif
        }
    }

    void takeOutData() {
        //会导致不能完全取出所有数据
//        for (int i = 0; i < 10000; ++i)
        while (1) {
            if (!dataQuene.empty()) {
#ifdef USE_MUTEX
                myMutex.lock();
                cout << "takeOutData 子线程:取出一个数据" << dataQuene.front() << endl;
                dataQuene.pop_front();
                myMutex.unlock();
#else
                cout << "takeOutData 子线程:取出一个数据" << dataQuene.front() << endl;
                dataQuene.pop_front();
#endif
            } else {
//                std::this_thread::sleep_for(std::chrono::milliseconds(1));
            }
        }
    }

private:
    std::list<int> dataQuene;
    mutex myMutex;
};
#endif


int main() {

    //1、创建并开启线程,线程入口是putInData, takeOutData 函数
#ifdef THREAD_BY_CLASS
    DealData myData;
    thread putThread(&DealData::putInData, ref(myData));
    thread takeThread(&DealData::takeOutData, ref(myData));
#endif
#ifdef THREAD_BY_FUNCTION
    thread putThread(&putInData);
    thread takeThread(&takeOutData);
#endif
    takeThread.join();
    putThread.join();

    return 0;
}

最后

有问题可以和我交流~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值