我发现了以下文章:Use GCC-provided atomic lock operations to replace pthread_mutex_lock functions
它指的是GCC Atomic Builtins。
本文的建议是使用GCC原子内置而不是pthread同步工具。
这是个好主意吗?
PS。 mysql帖子显然具有误导性。 Atomic Builtins无法替换所有pthread工具。例如,锁定要求,如果无法获取锁,则线程必须等待。换句话说,它要求操作系统等待,以便等待是被动的。简单的GCC内置无法做到这一点。
答案 0 :(得分:5)
这是个好主意吗?
如果你打算用gcc以外的东西编译代码,那就不行了。 pthreads会导致您遇到任何具体问题吗?
答案 1 :(得分:2)
如果您已经在使用pthread,并且pthread锁定函数已经执行了您想要的操作,则最好使用pthread锁定函数。
这些原子内置只是更高级原语的构建块;写这些更高级别的原语往往是棘手的,任何错误都可能导致错误,这可能需要很长时间才能显示出来(因为它们通常取决于时间)。如果您已经拥有一个具有更高级原语的库,它可以满足您的需求,而且速度足以满足您的需求(并且不要因为您必须进行函数调用而认为它们太慢),最好不要重新发明轮。
答案 2 :(得分:1)
没有。 GCC内置函数可能对编写操作系统,libc和pthreads本身的人很有意义,但对于普通应用程序,没有理由不使用pthreads方法。
即使你总是使用GCC,有一天你可能想要运行一个静态分析工具,它不能处理所有客户GCC扩展。
答案 3 :(得分:0)
http://gcc.gnu.org/ml/libstdc++/2006-06/msg00089.html
http://sources.redhat.com/ml/libc-alpha/2005-06/msg00132.html
答案 4 :(得分:0)
atomic builtins是有意义的。 Builtins允许您最小化互斥体序列化引起的争用。当您使用互斥锁并创建关键会话时,您可以序列化对代码中该部分的访问;在性能代码中,您可能希望尝试通过使用特定于线程的数据来避免争用,并且当不可能使用原子时。最后一种情况是锁定,当锁定时,最小化锁定的时间(使用消息传递和双重检查锁定虽然有些声称它不起作用 - 对我有用)。