繁体   English   中英

我们是否可以为所有其他调用使用pthreads互斥锁来锁定函数?

[英]Can we lock a function with a pthreads mutex for all its other calls?

说一个程序产生一个线程。 该线程调用func1()。 但是,func1()在主应用程序的其他位置也被调用。 如果我仅将其包装在线程中的互斥锁中,那么对整个应用程序来说安全吗? 还是必须将其锁定并锁定它? 而且,如果它在其中调用了其他函数,而且还在各个地方的主应用程序上调用了这些函数,是否必须递归地锁定它们?

摆脱掉以互斥保护功能的习惯,不是。

实际上,您可以保护诸如线程之间共享的变量之类的资源

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

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

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

您只需要锁定共享资源或任何非线程本地的资源。 您还应该考虑将函数编写为可重入。 可重入函数本质上是线程安全的,而并非所有的线程安全函数都可以被重入。

只要声明static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 在函数中并使用它,您可以完成所需的操作。 但是,使函数不能重入,具有全局状态等通常是不好的事情。 好的设计是锁定数据,而不要具有全局变量(或单例变量,这是对全局变量的委婉说法)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM