我有一个应该从我的cpu中获得最大值的程序。
通过pthreads进行多线程处理可以很好地完成他们的工作,除了他们“仅”将我的内核加载到大约60%的负载这在我看来是不够的。
我正在寻找原因并且问自己(特此是你)阻塞函数mutex_lock / cond_wait是否是候选者?
当一个线程无法在这样的函数中运行时会发生什么?
此致
没有人
更多信息 该设置是一个填充任务池的主线程和无数从该处获取作业的工作者,并等待在完成序列化计算时通过广播发出信号的条件。他们继续使用此计算中的值,直到完成,发送邮件并获取下一份工作......
答案 0 :(得分:3)
在典型的现代pthreads实现中,每个线程都由内核管理,而不像单独的进程。任何阻止调用,例如pthread_mutex_lock
或pthread_cond_wait
(还有,例如,read
)都会产生系统时间。然后,系统将找到另一个符合条件的线程,无论是在您的进程中还是在其他进程中,都可以运行它。
如果你的程序只占用了60%的CPU,那么I / O上的阻塞比pthread操作更容易被阻止,除非你的pthread操作过于精细。
答案 1 :(得分:0)
如果线程正在等待互斥/条件,它不会使用资源(好吧,只使用很少量)。每当线程进入等待状态时,控制切换到其他线程。释放互斥锁(或发出条件变量信号)时,线程会唤醒并获取互斥锁(如果没有其他线程首先抓取它),并继续运行。但是,如果某个其他线程获取互斥锁(如果多个线程正在等待它,则会发生这种情况),线程将返回休眠状态。