互斥量和条件变量
ps:参考了很多博客,但是当时没记下链接。。。 互斥器和条件变量用法如下: pthread_mutex_lock(&lock); while (condition_is_false) { pthread_cond_wait(&cond, &lock); } 上面那个while能换成if吗?答案是不能,否则会导致spurious wakeup虚假唤醒。因为不仅要在pthread_cond_wait前要检查条件是否成立,在pthread_cond_wait之后也要检查。因为pthread_cond_wait不仅能被pthread_cond_signal/pthread_cond_broadcast唤醒,而且还会被其它信号唤醒,后者就是虚假唤醒。 而且有可能多个线程被同时唤醒。那么在第一个获取完资源后,后面的全都无法获取资源了。 pthread_cond_wait内的互斥量只能保证同步。 linux的 pthread_cond_wait是用futex系统调用,这个是慢速系统调用 ,看过apue知道任何慢速系统调用被信号打断的时候会返回-1,并且把errno置为EINTR,如果慢速系统调用的重启功能被关闭,需要在调用该系统调用的地方手动重启它,像下面这样: while (1) { int ret = syscall(); if (ret < 0 && errno == EINTR)