线程同步的三种方式:
1、互斥量互斥量用pthread_mutex_t数据类型来表示。
两种方式初始化,第一种:赋值为常量PTHREAD_MUTEX_INITIALIZER;第二种,当互斥量为动态分配是,使用pthread_mutex_init函数进行初始化,使用pthread_mutex_destroy函数销毁。
#include<pthread.h> int pthread_mutex_init (pthread_mutex_t *__mutex, __const pthread_mutexattr_t *__mutexattr); int pthread_mutex_destroy (pthread_mutex_t *__mutex);
返回值:成功-0,失败-错误编号加解锁
加锁调用pthread_mutex_lock,解锁调用pthread_mutex_unlock。
#include<pthread.h> int pthread_mutex_lock (pthread_mutex_t *__mutex); int pthread_mutex_unlock (pthread_mutex_t *__mutex);
使用互斥量修改上一个程序(修改部分用红色标出):
pthread_mutex_t mylock=PTHREAD_MUTEX_INITIALIZER;
void *add(void *arg) {
int i = 0,tmp;
for (; i <500; i++)
{
pthread_mutex_lock(&mylock);
tmp=num+1;
num=tmp;
printf("+1,result is:%d\n",num);
pthread_mutex_unlock(&mylock);
}
return ((void *)0);
}
void *sub(void *arg)
{
int i=0,tmp;
for(;i<500;i++)
{
pthread_mutex_lock(&mylock);
tmp=num-1;
num=tmp;
printf("-1,result is:%d\n",num);
pthread_mutex_unlock(&mylock);
}
return ((void *)0);
}
2、读写锁 允许多个线程同时读,只能有一个线程同时写。适用于读的次数远大于写的情况。
读写锁初始化:
#include<pthread.h> int pthread_rwlock_init (pthread_rwlock_t *__restrict __rwlock, __const pthread_rwlockattr_t *__restrict __attr); int pthread_rwlock_destroy (pthread_rwlock_t *__rwlock);
返回值:成功--0,失败-错误编号加锁,这里分为读加锁和写加锁。
读加锁:
int pthread_rwlock_rdlock (pthread_rwlock_t *__rwlock)
写加锁:
int pthread_rwlock_wrlock (pthread_rwlock_t *__rwlock)
解锁用同一个函数:
int pthread_rwlock_unlock (pthread_rwlock_t *__rwlock)
3、条件变量条件变量用pthread_cond_t数据类型表示。
条件变量本身由互斥量保护,所以在改变条件状态前必须锁住互斥量。
条件变量初始化:
第一种,赋值常量PTHREAD_COND_INITIALIZER;第二种,使用pthread_cond_init函数
int pthread_cond_init (pthread_cond_t *__restrict __cond, __const pthread_condattr_t *__restrict __cond_attr); int pthread_cond_destroy (pthread_cond_t *__cond);