POSIX标准基于互斥和条件变量等概念定义了几个线程同步例程。
我现在的问题是:这些(例如pthreads_cond_init(),pthreads_mutex_init(),pthreads_mutex_lock()......等等)系统调用还是只是库调用?我知道它们是通过“pthread.h”包含的,但它们最终会导致系统调用,因此是在操作系统的内核中实现的吗?
答案 0 :(得分:9)
在Linux上,pthread互斥锁进行“futex”系统调用,但仅在锁定争用时进行。这意味着没有其他线程想要锁定几乎是免费的。
以类似的方式,当有人等待时,发送条件信号的费用很高。
所以我相信你的答案是pthread函数是有时导致系统调用的库调用。
答案 1 :(得分:2)
只要有可能,库就会出于性能原因避免陷入内核。如果您已经有一些使用这些调用的代码,您可能需要查看使用strace运行程序的输出,以更好地了解实际进行系统调用的频率。
答案 2 :(得分:1)
我从未查看过所有这些库调用,但据我所知,它们都涉及内核操作,因为它们应该在全局级别提供进程和/或线程之间的同步 - 我的意思是在操作系统级别。
内核需要维护 mutex ,例如线程列表:当前正在休眠的线程,等待锁定的互斥锁被释放。当当前锁定/拥有该互斥锁的线程使用pthread_mutex_release()
调用内核时,内核系统调用将浏览上述列表以获取等待互斥锁释放的更高优先级线程,将新的互斥锁所有者标记为互斥内核结构,然后将cpu(又名“ontect switch”)赠送给新的所有者线程,因此这个过程将从posix库调用pthread_mutex_lock()
返回。
当我在进程之间涉及IPC时,我只看到与内核的合作(我不是在单个进程级别的线程之间进行交谈)。因此我希望那些库调用调用内核,所以。
答案 3 :(得分:-3)
在Linux上使用pthread编译程序时,必须将-lphtread添加到编译器选项中。通过这样做,您告诉链接器链接libpthreads。所以,在linux上,它们是对库的调用。