多线程上对类变量加锁时锁粒度有关问题

多线程下对类变量加锁时锁粒度问题比如有一个类:classentity{public:intxvoidset_x(intx_){//lock1xx_}

多线程下对类变量加锁时锁粒度问题
比如有一个类:
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内加锁