栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

732-C++实现线程安全的链式栈

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

732-C++实现线程安全的链式栈

C++实现线程安全的链式栈
#include 
#include
#include
using namespace std;

struct empty_stack : std::exception//异常类的封装
{
	const char* what() const throw();
};
template
class Stack
{
private:
	struct StackNode//结构体 
	{
		T value;
		StackNode* next;
	};
	StackNode* Buynode()//申请节点 
	{
		StackNode* s = (StackNode*)malloc(sizeof(StackNode));
		if (NULL == s) exit(EXIT_FAILURE);
		memset(s, 0, sizeof(StackNode));
		return s;
	}
	void Freenode(StackNode* p)//释放节点 
	{
		free(p);
	}
private:
	StackNode* base;//指针
	size_t     cursize;//有效元素个数
	mutable std::mutex mtx;//互斥锁
	Stack(const Stack&);//拷贝构造函数私有化
	Stack& operator=(const Stack&);//赋值重载函数私有化
public:
	Stack() :base(nullptr) {}//构造函数 
	~Stack() { clear(); }//析构函数 
	size_t get_size() const//获取有效元素的个数 
	{
		std::lock_guard lock(mtx);
		return cursize;
	}
	bool is_empty() const//判空 
	{
		return get_size() == 0;
	}
	void clear()//清空 
	{
		std::lock_guard lock(mtx);
		while (base != nullptr)
		{
			StackNode* q = base;
			base = q->next;
			Freenode(q);
		}
		cursize = 0;
	}

	void push(const T& x)//入栈 
	{
		std::lock_guard lock(mtx);
		StackNode* s = Buynode();
		new(&(s->value)) T(x);
		s->next = base;
		//std::this_thread::sleep_for(std::chrono::seconds(1));
		base = s;
		cursize += 1;
	}
	T& top()//获取栈顶元素 
	{
		std::lock_guard lock(mtx);
		return base->value;
	}
	const T& top()const//获取栈顶元素 
	{
		std::lock_guard lock(mtx);
		return base->value;
	}
	void pop()//出栈 
	{
		std::lock_guard lock(mtx);
		if (base != nullptr)
		{
			StackNode* q = base;
			base = q->next;
			Freenode(q);
			cursize -= 1;
		}
	}
};

void thread_funa(Stack& s)//线程1
{
	for (int i = 0; i < 10; i += 2)
	{
		cout << i << endl;
		s.push(i);
	}
}
void thread_funb(Stack& s)//线程2
{
	for (int i = 1; i < 10; i += 2)
	{
		cout << i << endl;
		s.push(i);
	}
}

int main()
{
	Stack ist;
	thread ta(thread_funa, std::ref(ist));
	thread tb(thread_funb, std::ref(ist));

	ta.join();
	tb.join();

	cout << "thread end" << endl;
	while (!ist.is_empty())
	{
		int x = ist.top();
		ist.pop();
		cout << x << endl;
	}
	return 0;
}
运行截图

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/385035.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号