每日快看:初识互斥量

来源: 哔哩哔哩 2023-07-01 22:56:00


(资料图)

Case 0 :

运行的结果大概率是字母和数字混合在一起被打印出来,并不会先打印完全部数字再打印字母。这是因为线程的执行并没有确定的先后顺序。

Case 1 :

当多个线程涉及到共享数据时,为了防止条件竞争和数据访问冲突,需要用到互斥量(Mutex)。

访问共享数据前,将数据锁住,在访问结束后,再将数据解锁。当一个线程使用特定互斥量锁住共享数据时,其他的线程想要访问锁住的数据,都必须等到之前那个线程对数据进行解锁后,才能进行访问——这就是互斥量的作用。

Case 0的优化:

Case 1的优化:

使用互斥量来保护数据,并不是仅仅在每一个成员函数中都加入一个std::lock_guard对象那么简单,一个指针或引用,也会让这种保护形同虚设。

在上述代码中,函数process_data使用std::lock_guard来创建一个互斥量的锁保护区域,确保在同一时间只有一个线程可以访问Data对象的内容。但是在boom函数中调用process_data函数时,content的引用被传递给了malicious_func函数,从而使得通过unprotected_content指针可以绕过互斥量的保护,直接修改Data对象的内容,如果此时有其他线程在访问和修改Data对象,又将引发数据竞争和未定义的行为。

Warning:切勿将受保护数据的指针或引用传递到互斥锁作用域之外,无论是函数返回值,还是存储在外部可见内存,亦或是以参数的形式传递到其他函数中去。

关键词:

你可能会喜欢: