#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
int g_num = 0;//多个线程同时访问共享资源的时候需要需要用到互斥量,当一个线程锁住了互斥量后,其他线程必须等待这个互斥量解锁后才能访问它。
mutex g_mutex;//独占式互斥量加解锁是成对的,同一个线程内独占式互斥量在没有解锁的情况下,再次对它进行加锁这是不对的,会得到一个未定义行为。
void thread1()
{
//g_mutex.lock();
g_num = 10;//在线程1中std::mutex使用成员函数lock加锁unlock解锁,看起来工作的很好,但这样是不安全的,你得始终记住lock之后一定要unlock,但是如果在它们中间出现了异常或者线程直接退出了unlock就没有执行,因为这个互斥量是独占式的,所以在thread1没有解锁之前,其他使用这个互斥量加锁的线程会一直处于等待状态得不到执行。
for (int i = 0; i < 10;i++)
{
cout << "thread1: " << g_num << endl;
}
//g_mutex.unlock();
}
void thread2()
{
//lock_guard<mutex> lg(g_mutex);
g_num = 20;//lock_guard模板类使用RAII手法封装互斥量,在实例化对象的时候帮你加锁,并且能保证在离开作用域的时候自动解锁,所以你应该用lock_guard来帮你加解锁。
for (int i = 0; i < 10;i++)
{
cout << "thread2: " << g_num << endl;
}
}
int main(int argc, char* argv[])
{
thread t1(thread1);
thread t2(thread2);
t1.join();//在thread1输出的时候,thread2也会执行,输出的结果看起来有点乱(std::cout不是线程安全的),所以我们需要在它们访问共享资源的时候使用互斥量加锁。打开代码里面的三行注释就可以得到正确的结果了
t2.join();
system("pause");
return 0;
}
#include <thread>
#include <mutex>
using namespace std;
int g_num = 0;//多个线程同时访问共享资源的时候需要需要用到互斥量,当一个线程锁住了互斥量后,其他线程必须等待这个互斥量解锁后才能访问它。
mutex g_mutex;//独占式互斥量加解锁是成对的,同一个线程内独占式互斥量在没有解锁的情况下,再次对它进行加锁这是不对的,会得到一个未定义行为。
void thread1()
{
//g_mutex.lock();
g_num = 10;//在线程1中std::mutex使用成员函数lock加锁unlock解锁,看起来工作的很好,但这样是不安全的,你得始终记住lock之后一定要unlock,但是如果在它们中间出现了异常或者线程直接退出了unlock就没有执行,因为这个互斥量是独占式的,所以在thread1没有解锁之前,其他使用这个互斥量加锁的线程会一直处于等待状态得不到执行。
for (int i = 0; i < 10;i++)
{
cout << "thread1: " << g_num << endl;
}
//g_mutex.unlock();
}
void thread2()
{
//lock_guard<mutex> lg(g_mutex);
g_num = 20;//lock_guard模板类使用RAII手法封装互斥量,在实例化对象的时候帮你加锁,并且能保证在离开作用域的时候自动解锁,所以你应该用lock_guard来帮你加解锁。
for (int i = 0; i < 10;i++)
{
cout << "thread2: " << g_num << endl;
}
}
int main(int argc, char* argv[])
{
thread t1(thread1);
thread t2(thread2);
t1.join();//在thread1输出的时候,thread2也会执行,输出的结果看起来有点乱(std::cout不是线程安全的),所以我们需要在它们访问共享资源的时候使用互斥量加锁。打开代码里面的三行注释就可以得到正确的结果了
t2.join();
system("pause");
return 0;
}