3.数据竞争与互斥对象
#include <iostream>
#include <thread>
#include <string>
using namespace std;
void function_1() {
for (int i = 0; i > -100;i--)
cout << "From t1:" <<i<< endl;
}
//主线程和t1线程竞争来执行cout
int main() {
thread t1(function_1);
for (int i = 0; i < 100; i++)
cout << "From main:" << i << endl;
t1.join();
return 0;
}
#include <iostream>
#include <thread>
#include <string>
#include <mutex>
using namespace std;
mutex mu;
void shared_print(string msg, int id)
{
mu.lock();
cout << msg << id << endl; //互斥对象,可能会发生异常
mu.unlock();
}
void function_1() {
for (int i = 0; i > -100;i--)
shared_print("From t1:",i);
}
int main() {
thread t1(function_1);
for (int i = 0; i < 100; i++)
shared_print("From main::", i);
t1.join();
return 0;
}
#include <iostream>
#include <thread>
#include <string>
#include <mutex>
using namespace std;
mutex mu;
void shared_print(string msg, int id)
{
lock_guard<mutex> guard(mu);
//mu.lock();
cout << msg << id << endl; //互斥对象,可能会发生异常
//mu.unlock();
}
void function_1() {
for (int i = 0; i > -100;i--)
shared_print("From t1:",i);
}
int main() {
thread t1(function_1);
for (int i = 0; i < 100; i++)
shared_print("From main::", i);
t1.join();
return 0;
}
#include <iostream>
#include <thread>
#include <string>
#include <mutex>
#include <fstream>
using namespace std;
class LofFile
{
public:
LofFile(){
f.open("log.txt");
}
void shared_print(string id, int value)
{
lock_guard<mutex> locker(m_mutex);
f << "From" << id << ":" << value << endl;
}
//ofstrteam& GetStream(){return f;}
/*
void processf(void fun(ofstream&))
{
fun(f);
}
*/
protected:
private:
mutex m_mutex;
ofstream f;
};
void function_1(LofFile& log) {
for (int i = 0; i > -100;i--)
log.shared_print("From t1:",i);
}
int main() {
LofFile log;
thread t1(function_1,ref(log));
for (int i = 0; i < 100; i++)
log.shared_print("From main::", i);
t1.join();
return 0;
}
=======================================================================================
4.死锁
#include <iostream>
#include <thread>
#include <string>
#include <mutex>
#include <fstream>
using namespace std;
class LofFile
{
mutex m_mutex;
ofstream f; //被m_mutex保护的对象
public:
LofFile(){
f.open("log.txt"); //构造函数打开log.txt文件
}
void shared_print(string id, int value)
{
lock_guard<mutex> locker(m_mutex);
cout<< "From" << id << ":" << value << endl;
}
};
void function_1(LofFile& log) {
for (int i = 0; i > -100;i--)
log.shared_print("From t1:",i);
}
int main() {
LofFile log;
thread t1(function_1,ref(log));
for (int i = 0; i < 100; i++)
log.shared_print("From main::", i);
t1.join();
return 0;
}
#include <iostream>
#include <thread>
#include <string>
#include <mutex>
#incl