多线程对同一块数据进行操作我们都知道是要加锁的,如下代码,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);
...
}
}