我们可以为所有其他调用使用 pthreads 互斥锁锁定一个函数吗?

标签 c multithreading thread-safety pthreads

假设一个程序产生了一个线程。该线程调用 func1()。然而,func1() 也在主应用程序的其他地方被调用。如果我只将它包装在线程中的互斥锁中,它对整个应用程序是否安全?还是必须进入其中并锁定它?如果其中有它调用的其他函数,但也在不同地方的主应用程序上调用,是否必须递归并锁定它们?

最佳答案

改掉认为你用互斥体保护函数的习惯,你没有。

您实际上保护了资源,例如线程间共享的变量。

一旦您接受了这个小智慧,您就会开始思考哪些数据必须受到保护,并且可以最小化保护的粒度。

例如,如果func1()func2()都访问了共享变量x,那么你可以调用func2 () 来自 func1()main(),您将不得不设计一个解决方案来检测互斥体是否已被锁定,因此func2() 可以声明/释放(当从 main 调用时)或什么也不做(当从 func1() 调用时)。或者使用递归互斥体。

线程不安全的函数(例如使用静态数据区域)可以用互斥体保护,但我发现通常更容易重构它们,使它们本质上是线程安全的(分配内存或线程本地存储)。

关于我们可以为所有其他调用使用 pthreads 互斥锁锁定一个函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4357169/

相关文章:

java - Android 应用程序在使用 JNI 后随机崩溃

c# - 多线程.NET队列问题

objective-c - 以线程安全的方式启动和停止操作

multithreading - 使用 LD_PRELOAD 和线程安全注入(inject)线程

c# - C#有关线程安全的问题

c - 浮点值的输出有什么区别?

多次调用 C 预处理器宏(通过变量)

c++ - 如何开始为 Linux 编写防火墙?

java守护线程

java - GenericObjectPools borrowObject 方法线程安全吗?