互斥锁也叫互斥量,可以看作一种特殊的信号量。信号量可以>=0,大家可以排队使用信号量,互斥锁只有0、1,主要实现关键段保护,只能在某一时间给某一任务去调用这段资源,这段内容用之前上锁,用完时候解锁。
pthread_mutex_init()//申请互斥锁
pthread_mutex_destroy//销毁互斥锁
pthread_mutex_lock()//上锁
pthread_mutex_unlock()//解锁
pthread_mutex_t mutex;定义互斥锁
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);void *func(void *arg)
{sleep(1);//不与主线程抢占第一次上锁while(0==flag){pthread_mutex_lock(&mutex);......处理......pthread_mutex_unlock(&mutex);sleep(1);//不与主线程抢资源获取的锁}pthread_exit(NULL);//线程退出
}int main(void)
{pthread_mutex_init(&mutex,NULL);互斥锁初始化ret=pthread_create(&th,NULL,func,NULL);线程创建while(1){pthread_mutex_lock(&mutex);scanf("%s",buf);pthread_mutex_unlock(&mutex);......此时子线程解锁处理资源......sleep(1);//不与子线程抢处理}ret=pthread_join(th,NULL);//线程回收pthread_mutex_destroy(&mutex);//销毁互斥锁
}
条件变量方式实现线程同步,首先这是线程特有的方法,支持阻塞与唤醒。
int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);//初始化int pthread_cond_destroy(pthread_cond_t *cond);//销毁
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);//等待
int pthread_cond_signal(pthread_cond_t *cond);//发信号一对一
int pthread_cond_broadcast(pthread_cond_t *cond);//发信号一对多
以上就是常见的函数。
void *func(void *arg)
{while(0==flag){pthread_mutex_lock(&mutex);pthread_cond_wait(&cond,&mutex);......资源加工......pthread_mutex_unlock(&mutex);}pthread_exit(NULL);
}int main()
{pthread_mutex_init(&mutex,NULL);pthread_cond_init(&cond,NULL);ret=pthread_create(&th,NULL,func,NULL); while(1){scanf("%s",buf);pthread_cond_signal(&cond);发信号让子线程干活......主线程干活......}ret=pthread_join(th,NULL);//子线程回收pthread_mutex_destroy(&mutex);//销毁锁pthread_cond_destroy(&cond);//销毁条件变量
}
条件变量同步必须在解锁与开锁之间进行。