多线程互斥读写数据的一点改进

本文探讨了多线程环境下数据同步的问题,并提出了一种通过数据复制来避免长时间写操作导致读线程阻塞的方法。这种方法通过使用局部变量与互斥锁确保数据一致性的同时,提升了读操作的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多线程对同一块数据进行操作我们都知道是要加锁的,如下代码,Read线程更新g_data数据,Write线程需要的时候写入g_data数据。

std::vector<char> g_data;
std::mutex g_mutex;

void Read()
{
	while (1)
	{
		...
		{
			std::lock_guard<std::mutex> lg(g_mutex);
			read(g_data);
		}
		...
	}
}

void Write()
{
	while (1)
	{
		...
		{
			std::lock_guard<std::mutex> lg(g_mutex);
			write(g_data);
		}
		...
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	std::thread t1(Read);
	std::thread t2(Write);

	t1.join();
	t2.join();
}
但是,如果write(g_data)函数花的时间太多了(如写入磁盘文件),那么调用Read的线程就会被阻塞掉。

改进方法是:其实我们只要把g_data复制一份出来,然后就可以慢慢的对复制出来的数据进行操作了,

显然在内存里复制一份数据要比write(g_data)快多了,代码如下:

void Write()
{
	while (1)
	{
		...
		std::vector<char> localData;
		{
			std::lock_guard<std::mutex> lg(g_mutex);
			localData.swap(g_data); // 这里会清空g_data
		}
		write(localData);
		...
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值