假设一个程序产生了一个线程。该线程调用 func1()。然而,func1() 也在主应用程序的其他地方被调用。如果我只将它包装在线程中的互斥锁中,它对整个应用程序是否安全?还是必须进入其中并锁定它?如果其中有它调用的其他函数,但也在不同地方的主应用程序上调用,是否必须递归并锁定它们?
最佳答案
改掉认为你用互斥体保护函数的习惯,你没有。
您实际上保护了资源,例如线程间共享的变量。
一旦您接受了这个小智慧,您就会开始思考哪些数据必须受到保护,并且可以最小化保护的粒度。
例如,如果func1()
和func2()
都访问了共享变量x
,那么你可以调用func2 ()
来自 func1()
或 main()
,您将不得不设计一个解决方案来检测互斥体是否已被锁定,因此func2()
可以声明/释放(当从 main
调用时)或什么也不做(当从 func1()
调用时)。或者使用递归互斥体。
线程不安全的函数(例如使用静态数据区域)可以用互斥体保护,但我发现通常更容易重构它们,使它们本质上是线程安全的(分配内存或线程本地存储)。
关于我们可以为所有其他调用使用 pthreads 互斥锁锁定一个函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4357169/