我正在尝试使 C++ API(用于 Linux 和 Solaris)线程安全,以便可以从不同的线程调用它的函数而不会破坏内部数据结构。在我目前的方法中,我使用 pthread 互斥锁来保护对成员变量的所有访问。这意味着一个简单的 getter 函数现在可以锁定和解锁互斥体,我担心这样做的开销,特别是因为该 API 将主要用于单线程应用程序,其中任何互斥体锁定似乎都是纯粹的开销。
所以,我想问一下:
最佳答案
所有现代线程实现都可以完全在用户空间中处理非竞争互斥锁(只需几条机器指令)——只有当存在争用时,库才必须调用内核。
要考虑的另一点是,如果应用程序没有显式链接到 pthread 库(因为它是单线程应用程序),它只会获得虚拟 pthread 函数(根本不做任何锁定) -只有当应用程序是多线程的(并链接到 pthread 库)时,才会使用完整的 pthread 函数。
最后,正如其他人已经指出的那样,使用互斥锁保护诸如 isActive 之类的 getter 方法是没有意义的——一旦调用者有机会查看返回值,该值可能已经被更改(因为互斥锁只锁定在 getter 方法中)。
https://stackoverflow.com/questions/1277627/