根据以下场景同步两个线程的最佳方法?

时间:2012-02-06 23:16:07

标签: c++ multithreading mutex

对于一个问题,这可能听起来很基本,但我从未有过正式(如果有)答案。

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

  • 主题1:  而(1)     读(shared_data)

  • 主题2:  而(1)     锁(shared_mutex)     写(shared_data)     解锁(shared_mutex)

如果Thread 1只执行了读取数据,是否还需要锁定互斥锁?或者只是写线程需要这样做?

感谢名单

3 个答案:

答案 0 :(得分:2)

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

长答案如果读者没有锁定数据来读取数据,如果写入线程在读取数据时写入线程正在写入数据,则线程最终会读取损坏的数据。在现代的多核/多处理器世界中,不要指望任何数据类型在原子上安全地进行读写。

编辑(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)

答案 1 :(得分:0)

如果在写作期间阅读不是问题,那么你不需要锁定来阅读,但是你不需要锁定来写。所以你需要在阅读时锁定。

答案 2 :(得分:0)

如果你只有2个线程,那么互斥锁没有做任何有用的事情。如果T2在读取它时改变shared_data是可以的,那么取出互斥锁。如果(并且这很可能)不正常(因为T1,在单次读取时,可以看到一些旧数据和一些新数据),那么T1需要使用互斥锁调用来保护读取。