pthread互斥锁定和解锁每个变量
pthread mutex lock and unlock per variable
我想知道锁定和解锁线程之间共享的对象中变量的互斥锁的最佳实践是什么。
这就是我一直在做的事情,到目前为止似乎还不错,只是想知道这是否过度:
class sharedobject
{
private:
bool m_Var1;
pthread_mutex_t var1mutex;
public:
sharedobject()
{
var1mutex = PTHREAD_MUTEX_INITIALIZER;
}
bool GetVar1()
{
pthread_mutex_lock(&var1mutex);
bool temp = m_Var1;
pthread_mutex_unlock(&var1mutex);
return temp;
}
void SetVar1(bool status)
{
pthread_mutex_lock(&var1mutex);
m_Var1 = status;
pthread_mutex_unlock(&var1mutex);
}
};
这不是我的实际代码,但它显示了我如何对线程之间共享的对象中的每个变量使用互斥。我没有针对整个对象的互斥对象的原因是,一个线程可能需要几秒钟才能完成对部分对象的操作,而另一个线程检查对象的状态,另一个螺纹再次从对象获取数据
我的问题是,为线程之间访问的对象中的每个变量创建一个互斥锁,然后在读取或写入变量时锁定和解锁该变量,这是一种好的做法吗?
我对正在检查状态的变量使用trylock(这样我就不会在处理变量时创建额外的线程,也不会让程序等待锁定)
我在处理线程方面没有太多经验。我希望使程序线程安全,但它也需要尽可能地发挥最佳性能。
如果您保护的成员是读写的,并且可以在任何时候由多个线程访问,那么您所做的并不过分——这是必要的。
如果你能证明一个成员不会改变(是不可变的),那么就没有必要用互斥锁来保护它。
许多人更喜欢每个线程都有一个不可变的数据副本的多线程解决方案,而不是多线程访问同一副本的解决方案。这消除了对内存屏障的需要,并经常提高执行时间和代码安全性。
您的里程数可能有所不同。
相关文章:
- 我应该在锁定TBitmap画布后解锁它吗
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- c++ 为什么我不应该从不同的线程解锁互斥锁
- 在新作用域中使用unique_lock是否等效于在使用共享资源的工作结束时解锁调用
- "data race"(不是真的)在通知条件变量并解锁关联的互斥锁后
- 程序输入密码并解锁窗口7,8,10
- 在通知之前完成手动解锁
- STD :: Mutex如何在不同的线程中解锁
- 如何使用单个解锁方法(可称为读取器或写入器)实现C++读写器锁?
- 如何在C 中自动汇总日志消息并自动解锁互斥X
- 如果我们已经手动解锁了unique_lock,那么破坏时会解锁吗?
- 正在解锁手动未定义/不良设计的锁定guard
- 从C 运行代码后解锁绑定(在R中)的问题
- 在功能返回之前,可以解锁Mutex会增加并发
- 当互斥锁解锁时,它会notify_all或notify_one
- 如何确保在C ++中解锁储物柜?哪种解决方案更好
- 我应该如何在一个功能中锁定wxMutex,并在另一个功能中将其解锁
- mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
- 在Qt 5.4中可以对互斥对象进行两次解锁吗
- C++线程:等待condition_variable后无法解锁阵列中的互斥锁