线程之间的同步
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程之间的同步相关的知识,希望对你有一定的参考价值。
我是学生,我想了解线程之间的同步。
我有两个线程t1和t2。
我和他们之间有一块共享的记忆。
/*e.g.*/ std::map<std::string, std::string> data;
一个线程让我们说t1正在读数据,而另一个正在写...
std::mutex mu; //is used for synchronization
std::string read_1(std::string key)
{
return data[key];
}
std::string read_2(std::string key)
{
mu.lock();
return data[key];
mu.unlock();
}
void write(std::string key, std::string value)
{
mu.lock();
data[key] = value;
mu.unlock();
}
read_1是线程安全的吗?
如果不是优化此代码的最佳方法是什么?
谢谢。
答案
没有.read_1
不是线程安全的。它需要在访问data
之前锁定互斥锁。
这样会很安全;
std::string read_1(std::string key)
{
std::lock_guard<std::mutex> guard(mu);
return data[key];
}
也;你的read_2
功能坏了。它在解锁互斥锁之前返回。如果您使用过std::lock_guard
,那么您就不会遇到这个问题。
另一答案
read_1是线程安全的吗?
不,当可能存在对该数据的写入时,它正在读取。
如果不是优化此代码的最佳方法是什么?
也许使用std::shared_mutex。
以上是关于线程之间的同步的主要内容,如果未能解决你的问题,请参考以下文章