// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>
#include <thread>
#include<vector>
#include<string>
#include<vector>
#include<queue>
#include<list>
#include<mutex>
using namespace std;
class A {
private:
list<int> msglist;
mutex m;
public:
void inqueue() {
for (int i = 1;i <= 100000;i++)
{
cout << "---------插入一个元素" << i << endl;
m.lock();
msglist.push_back(i);
m.unlock();
}
}
void outqueue() {
for (int i = 1;i <= 100000;i++) {
if (!msglist.empty())
{
m.lock();
lock_guard<mutex> g(m,adopt_lock); //随便取的名字.lock_guard类构造的时候调用了mutex的lock函数,函数执行结束时lock_guard被析构调用了unlock
int commond = msglist.front();
msglist.pop_front();
cout << "---------取出一个元素" << commond << endl;
}
else
{
cout << "inqeue在执行,但为空" << endl;
}
}
cout << "ending" << endl;
}
};
int main() {
/* 互斥条件:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被占有者释放。
不可剥夺条件:进程所获得的资源在未使用完毕之前,不被其他进程强行剥夺,而只能由获得该资源的进程资源释放。
请求和保持条件:进程每次申请它所需要的一部分资源,在申请新的资源的同时,继续占用已分配到的资源。
循环等待条件:在发生死锁时必然存在一个进程等待队列{ P1,P2,…,Pn }, 其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路,环路中每一个进程所占有的资源同时被另一个申请,也就是前一个进程占有后一个进程所深情地资源。
破坏“不可剥夺”条件:一个进程不能获得所需要的全部资源时便处于等待状态,等待期间他占有的资源将被隐式的释放重新加入到 系统的资源列表中,可以被其他的进程使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行。
破坏”请求与保持条件“:第一种方法静态分配即每个进程在开始执行时就申请他所需要的全部资源。第二种是动态分配即每个进程在申请所需要的资源时他本身不占用系统资源。
破坏“循环等待”条件:采用资源有序分配其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。
————————————————
*/
A obj;
thread a(&A::inqueue, &obj);
thread b(&A::outqueue, &obj);
a.join();
b.join();
return 0;
}
多线程互斥锁
于 2023-07-18 16:45:58 首次发布