基于以下场景同步两个线程的最佳方式

Best way to synchronize two threads based on the following scenario?

本文关键字:两个 线程 方式 最佳 同步      更新时间:2023-10-16

这听起来可能是一个问题的基本答案,但我从来没有正式的答案(如果有的话)。

同步以下内容的最佳方式(有效方式)是什么:

  • 线程1:而(1)读取(共享数据)

  • 线程2:而(1)锁(shared_mutex)写入(shared_data)解锁(shared_mutex)

如果线程1只读取数据,那么它是否也需要锁定互斥体?或者只是写线程需要这样做?

Thanx

简短回答所有访问共享数据的线程都需要获取一个保护该数据的锁。

长答案如果读取器不锁定数据进行读取,那么如果写入线程在读取器读取数据时正在写入数据,那么线程最终可能会读取损坏的数据。在现代多核/多处理器世界中,不要指望任何数据类型在原子级上都可以安全读取或写入。

Edit(By Shahbaz):事实上,在您的示例中,Thread 2总是成功地锁定互斥对象,因此根本不会发生同步。在你的简单案例中,答案也很简单:

Thread 1:
    while(1)
        lock(shared_mutex)
        read(shared_data)
        unlock(shared_mutex)
Thread 2:
    while(1)
        lock(shared_mutex)
        write(shared_data)
        unlock(shared_mutex)

如果在写入过程中读取不是问题,那么您不需要用于读取的锁,但也不需要用于写入的锁。所以你需要在这里阅读时锁定。

如果只有两个线程,那么互斥对象就没有任何用处。如果T2在T1读取shared_data时更改它是可以的,那么取出互斥锁。如果(这很可能)不正常(因为T1在一次读取时可以看到一些旧数据和一些新数据),那么T1需要用互斥调用来保护读取。