【发布时间】:2021-06-04 22:57:00
【问题描述】:
在编写多线程代码时,我经常需要读取/写入共享内存。为了防止数据争用,首选的解决方案是使用lock_guard 之类的东西。但是最近,我遇到了“同步值”的概念,它通常以以下方式实现:
template <typename T>
class SynchronizedValue {
T value;
std::mutex lock;
/* Public helper functions to read/write to a value, making sure the lock is locked when the value is written to*/
};
此类同步值将有一个方法SetValueTo,该方法将锁定互斥体、写入值并解锁互斥体,确保您可以安全地写入值而不会发生任何数据争用。
这使得编写多线程代码变得非常容易!但是,与互斥锁/lock_guard 相比,使用这些同步值是否有任何缺点/性能开销?
【问题讨论】:
-
您能否提供不使用上述同步值的等效代码?也就是说,如果您使用大量锁是因为不同的线程竞争(!)共享资源,您应该重新考虑您的设计。而是沟通和合作。这与你的问题无关,但我感觉你的方向错了。
-
@UlrichEckhardt 这只是一个纯粹出于好奇的一般 c++ 问题,因为我试图理解多线程......我现在什至没有在我的项目中使用多线程! :)
-
@UlrichEckhardt 带有 lock_guard 的代码将只有一个全局互斥锁,并在每个多线程函数的开头实例化一个 lock_guard。
标签: c++ multithreading concurrency shared-memory