31 c++ linux performance mutex pthreads
我正在尝试使C++ API(对于Linux和Solaris)具有线程安全性,以便可以从不同的线程调用其函数,而不会破坏内部数据结构.在我目前的方法中,我使用pthread互斥锁来保护对成员变量的所有访问.这意味着一个简单的getter函数现在可以锁定和解锁互斥锁,我担心这会产生开销,特别是因为API主要用于单线程应用程序,其中任何互斥锁定看起来都是纯粹的开销.
所以,我想问一下:
cme*_*erw 36
所有现代线程实现都可以完全在用户空间中处理无争用的互斥锁(只有几个机器指令) - 只有在存在争用时,库才必须调用内核.
需要考虑的另一点是,如果应用程序没有显式链接到pthread库(因为它是单线程应用程序),它将只获取虚拟pthread函数(根本不执行任何锁定) - 仅当应用程序是多线程的(并链接到pthread库),将使用完整的pthread函数.
最后,正如其他人已经指出的那样,使用互斥锁来保护像isActive这样的东西的getter方法毫无意义 - 一旦调用者有机会查看返回值,该值可能已经被更改(如互斥锁只能锁定在getter方法中.
这有点偏离主题,但你似乎是新的线程 - 一方面,只有线程可以重叠的锁定.然后,尽量减少这些地方.此外,不要试图锁定每个方法,而是考虑线程正在做什么(整体)与一个对象,并进行一次调用,并锁定它.尽量让你的锁尽可能高(这再次提高效率,可能/帮助/避免死锁).但锁不会"组合",你必须在心理上至少按线程和重叠的方式对代码进行交叉组织.
互斥锁需要操作系统上下文切换。那是相当昂贵的。CPU 仍然可以每秒执行数十万次,而不会有太多麻烦,但它比没有互斥体要昂贵得多。将它放在每个变量访问上可能有点矫枉过正。
它也可能不是您想要的。这种暴力锁定往往会导致死锁。
您知道保护此类变量访问的更好方法吗?
设计您的应用程序,以便共享尽可能少的数据。代码的某些部分应该同步,可能使用互斥体,但仅限那些实际需要的部分。通常不是单个变量访问,而是包含必须以原子方式执行的变量访问组的任务。(也许您需要设置is_active标志以及其他一些修改。设置该标志并且不对对象进行进一步更改是否有意义?)