当pthreads在mutex_lock / cond_wait中等待时会发生什么?

时间:2011-07-12 21:00:14

标签: c++ multithreading pthreads conditional mutex

我有一个应该从我的cpu中获得最大值的程序。

通过pthreads进行多线程处理可以很好地完成他们的工作,除了他们“仅”将我的内核加载到大约60%的负载这在我看来是不够的。

我正在寻找原因并且问自己(特此是你)阻塞函数mutex_lock / cond_wait是否是候选者?

当一个线程无法在这样的函数中运行时会发生什么?

  • pthread是否切换到它处理的另一个线程或
  • 线程是否会给系统带来时间,如果是后者,我可以改变这种行为吗?

此致

没有人

更多信息 该设置是一个填充任务池的主线程和无数从该处获取作业的工作者,并等待在完成序列化计算时通过广播发出信号的条件。他们继续使用此计算中的值,直到完成,发送邮件并获取下一份工作......

2 个答案:

答案 0 :(得分:3)

在典型的现代pthreads实现中,每个线程都由内核管理,而不像单独的进程。任何阻止调用,例如pthread_mutex_lockpthread_cond_wait(还有,例如,read)都会产生系统时间。然后,系统将找到另一个符合条件的线程,无论是在您的进程中还是在其他进程中,都可以运行它。

如果你的程序只占用了60%的CPU,那么I / O上的阻塞比pthread操作更容易被阻止,除非你的pthread操作过于精细。

答案 1 :(得分:0)

如果线程正在等待互斥/条件,它不会使用资源(好吧,只使用很少量)。每当线程进入等待状态时,控制切换到其他线程。释放互斥锁(或发出条件变量信号)时,线程会唤醒并获取互斥锁(如果没有其他线程首先抓取它),并继续运行。但是,如果某个其他线程获取互斥锁(如果多个线程正在等待它,则会发生这种情况),线程将返回休眠状态。