什么数据是安全的?
只读数据是安全的。
什么数据是不安全的?
同一个地址数据有读有写,如果不做处理,容易冲突崩溃。
互斥量 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;
}
最后
有问题可以和我交流~