互斥锁也叫互斥量,可以看作一种特殊的信号量。信号量可以>=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);//销毁条件变量
}
条件变量同步必须在解锁与开锁之间进行。