繁体   English   中英

C ++中的设计线程安全变量类

[英]Design thread safe variable class in C++

我遇到一个常见问题(在此处以多种变体形式发布),该过程运行多个线程,每个线程都可以读取或写入一组公共变量(为简单起见,它是单个变量)。

每个变量都应防止并行写入,并允许并行读取。

我已经看到了几种解决方案,并决定专注于以下使用警卫的解决方案(在此链接中提到)

但是,我无法弄清楚以下原则:

  1. MutexGuard类:不应将其实现为单例。 否则,每个线程将创建新的互斥锁,而不是等待单个公用互斥锁。

  2. 如果MutexGuard类不是singleTon,则至少m_Mutex应该是静态的,以便它将在此类的所有实例之间共享。

  3. 为什么将function1和function2定义为静态。 这样,就可以在没有实例上下文的情况下调用它(类仅是名称空间),并且m_SharedVar的值可能会丢失。

  4. 有什么简单的方法可以修改多读取器/单写入器锁的实现? 在这种情况下,我应该只更改互斥锁类型吗?

     class MutexGuard { MutexType & m_Mutex; public: inline MutexGuard(MutexType & mutex) : m_Mutex(mutex) { m_Mutex.lock(); }; inline ~MutexGuard() { m_Mutex.unlock(); }; } class TestClass { MutexType m_Mutex; double m_SharedVar; public: TestClass() : m_SharedVar(4.0) { } static void Function1() { MutexGuard scopedLock(m_Mutex); //lock the mutex m_SharedVar+= 2345; //mutex automatically unlocked } static void Function2() { MutexGuard scopedLock(m_Mutex); //lock the mutex m_SharedVar*= 234; throw std::runtime_error("Mutex automatically unlocked"); } } 

我认为这里的问题是TestClass 正如@TonyD正确地指出,实施MutexGuard应该不会被绑定到独居,除非是明确必要的。 MutexGuard的目的是自动为调用者执行给定互斥lock()unlock() 因此, MutexGuard的调用者不必显式地lock()unlock()

现在, TestClass有责任保护互斥体不被多重访问。 通常,如果每个函数都锁定与该类实例共享的互斥锁,则将自动保护使用TestClass函数的所有辅助线程。 同样,它是特定于实现的。 所有实例可以有一个静态互斥量,也可以有针对不同共享资源的多个互斥量等。

现在谈到你的问题

有什么简单的方法可以修改多读取器/单写入器锁的实现? 在这种情况下,我应该只更改互斥锁类型吗?

您将必须理解,多个读者/一次写入是一个神话。 它不保证并行性。 这仅意味着,根据需要,锁定/解锁会更​​快。 即,除非有人写日期,否则多个读者可以读取数据(假设值未更改)。 在这种情况下,您可能需要实现称为reader-writer锁的功能。

我的教授总是把mutex锁称为胖锁 它实际上并不能区分读/写,并且始终具有恒定的锁定时间,无论您打算在共享资源上进行什么工作。

有关更多信息,请参阅 stackoverflow帖子。 或者,您也可以使用现成的BOOST读写器锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM