多线程下对类变量加锁时锁粒度问题
比如有一个类:
class entity
{
public:
int x;
void set_x(int x_)
{
//lock1
x = x_;
}
};
vector <entity*> entities;
void func()
{
while(1)
{
//lock2
entity* ent = entities[0];
//lock3
ent-> set_x(rand());
}
}
int main()
{
entity *ent = new entity();
entities.push_back(ent);
thread t1(func());
thread t2(func());
t1.run();
t2.run();
}
上面程序的有目的是要修改保存在vector中的对象指针指向的成员变量,那我是应该在vector上,还是对象指针上,还是对象成员变量上加锁呢?
[解决办法]
entity* ent = entities[0];前后加锁解锁,lock1保留,lock3去掉
[解决办法]
1, 锁要加在离临界区最近的地方, lock1和lock3保留其一。lock1离临界区最近,保留它。但是lock1可能会让set_x不能内联。
2, 是否枷锁看有竞争。 如果entites初始化后不再修改,只有读操作,无需枷锁,去掉lock2.
3, 主线程要等着住线程结束。如果主线先于子线程结束,entites会被析构,引起也指针。
[解决办法]
如果不能确定entity对象的使用环境(被那些函数调用),国际惯例是在对象级别上加锁——set内加锁
多线程上对类变量加锁时锁粒度有关问题
多线程下对类变量加锁时锁粒度问题比如有一个类:classentity{public:intxvoidset_x(intx_){//lock1xx_}
