对于一个问题,这可能听起来很基本,但我从未有过正式(如果有)答案。
同步以下内容的最佳方式(有效方式)是什么:
主题1: 而(1) 读(shared_data)
主题2: 而(1) 锁(shared_mutex) 写(shared_data) 解锁(shared_mutex)
如果Thread 1只执行了读取数据,是否还需要锁定互斥锁?或者只是写线程需要这样做?
感谢名单
答案 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需要使用互斥锁调用来保护读取。