- 单例模式的线程安全
- 必要双重判空指针,低沉锁冲突的概率,进步性能
- 原因1:
- 当第一次实例化单例时,可能有多个线程同时到来,而且svr指针为空
- 这时他们就会去竞争锁,但只有一个线程会最快拿到锁,而且乐成实例化出单例对象
- 但此时如果不加双重判空指针,那些也进了第一层if判断的,仍然会去实例化出对象
- 原因2:
- 为了线程安全,肯定要加锁,加锁之后再去判空
- 但每次调用GetInstance()都必要去获得锁,释放锁,服从低下
- 此时再加一层外层if判空,这样就会避免后续调用GetInstance()时没必要的锁竞争
- static void *ThreadRoutine(void *args)为什么要设置为static方法?
- pthread_create传递给线程的方法只能是返回值为void*,参数为void*的函数
- static将函数方法声明为静态方法,此时该方法没有隐含的this指针,就可以在类内把这个方法传递给线程调用了
- int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
- void *(*start_routine) (void *), void *arg);
复制代码
- while()防止伪唤醒
- 可能条件变量唤醒线程时,有多个线程同时被唤醒,但是只有一个最快的线程PopTask()可以拿到任务,此时其他线程就会出错
- while()可以在被唤醒的情况下,再次判断任务队列是否有任务
- 这样可以包管,在某个线程醒来的时间,肯定是占据互斥锁的
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |