基于以下场景同步两个线程的最佳方式
Best way to synchronize two threads based on the following scenario?
这听起来可能是一个问题的基本答案,但我从来没有正式的答案(如果有的话)。
同步以下内容的最佳方式(有效方式)是什么:
-
线程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需要用互斥调用来保护读取。
相关文章:
- 在两个线程上读/写 64 位,无互斥/锁定/原子
- 如果两个线程相互依赖,则 cpp 线程连接应使用连接导致死锁
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- 简单使用 std::atomic 在两个线程之间共享数据
- 如何使用 pthreads 以正确的方式设置两个线程之一的优先级
- 曼德布洛特 从一个线程被反复使用变为两个线程
- C++ 两个线程,共享几个整数变量
- 如何正确同步这两个线程?
- 两个线程尝试将一些数据读/写到数据库中表的同一行中
- 两个线程的公共资源 - 同步足够吗?
- 如果两个线程调用同一个函数,但函数中的所有变量都是局部变量,我还需要担心线程之间共享数据吗?
- 当两个线程同时尝试在同一静音上尝试try_lock()时会发生什么
- C 带有两个线程的boost async_read vs
- 使用 Poco:Condition 唤醒两个线程
- C 两个线程一个用于输入,一个用于输出
- 将两个线程同步到同一个计时器
- 全局变量的最终值,该变量正在通过两个线程进行增量
- C++中两个线程的互斥体
- Qthread char阵列在两个线程之间传递后被摧毁
- 如何使用CPP中使用一个对象运行同一类的两个线程