线程之间的同步

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

以上是关于线程之间的同步的主要内容,如果未能解决你的问题,请参考以下文章

线程同步-使用ReaderWriterLockSlim类

java多线程有几种实现方法?线程之间如何同步

java基础入门-多线程同步浅析-以银行转账为样例

ios多线程中 同步异步与队列之间的关系

起底多线程同步锁(iOS)

C ++ Boost:2个线程之间的变量同步