C++多线程同步与通信问题
目前学习了两种模式
- 一种是使用#include 头文件创建互斥锁 互斥锁的使用有两种方法一种直接创建互斥锁对象调用上锁解锁函数,第二种使用模板进行调用不用考虑解锁执行完毕自动解锁
- 一种是使用Windows的API接口进行临界区的设置 这种方法需要考虑临界区的创建,初始化 上锁解锁以及使用后的释放
- 死锁的解决方案 由于多个线程获取多个锁资源的时候,顺序不一致导致的死锁问题,那么保证它们获取锁的顺序是一致的,问题就可以解决。例如同时上锁
std::lock(my_mutex_1, my_mutex_2);的作用就是,同时去锁my_mutex_1,
my_mutex_2,必须同时锁成功,一旦有一个互斥量不能被锁,线程就会卡在这里,直至两个锁可以被同时锁成功,这样就避免了死锁的现象。
使用mutex创建互斥锁有两种方式,代码如下
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
mutex m_mutex;
//互斥锁调用上锁解锁函数
void print(int &ID)
{
m_mutex.lock();
cout << "ID:" << ID << endl;
m_mutex.unlock();
return;
}
//互斥锁使用模板不用解锁步骤
void print2(int &ID)
{
lock_guard<mutex> lock(m_mutex);
cout << "ID:" << ID << endl;
return;
}
int main1()
{
int ID = 10;
thread threadArry[10];
for (int i = 0; i < ID; i++)
{
threadArry[i] = thread(print2, ref(i));
}
for (int i = 0; i < ID; i++)
{
threadArry[i].join();
}
system("pause");
return 0;
}
使用window提供的API创建临界区代码如下
#include <iostream>
#include <thread>
#include <windows.h>
using namespace std;
//定义临界区对象
CRITICAL_SECTION cs;
//临界区方式进行线程同步-本质还是互斥锁
void print3(int &ID)
{
//上锁
EnterCriticalSection(&cs);
cout << "ID:" << ID << endl;
//解锁
LeaveCriticalSection(&cs);
return;
}
int main()
{
//初始化临界区对象
InitializeCriticalSection(&cs);
int ID = 10;
thread threadArry[10];
for (int i = 0; i < ID; i++)
{
threadArry[i] = thread(print3, ref(i));
}
for (int i = 0; i < ID; i++)
{
threadArry[i].join();
}
//程序结束时需要释放临界区对象
DeleteCriticalSection(&cs);
system("pause");
return 0;
}