一、 线程同步
1.1为什么要进行线程同步?
当多个线程共享同一内存的时候,可能会出现某个线程在修改变量,而另一线程读取到不一致的数据。所以不得不使用锁,在同一时间只允许一个线程访问该变量。
如图描述这种同步,如果线程B要读取该变量,首先要获得锁。同样,线程A要更新该变量,也要获取同样的这把锁。也就是线程B在线程A释放这把锁之前不能读取该变量。
1.2 互斥锁
概念: 实现线程访问临界资源的同步控制。 如果一个线程在临界区开始时,给互斥锁加锁, 那么其他的线程就必须等待线程解锁, 才能接着运行, 并访问资源。
操作: 初始化, 加锁、 解锁、 销毁锁
互斥锁: pthread_mutex_t 锁类型
锁初始化:
int pthread_mutex_init(pthread_mutex_t *mutex,
pthread_mutexattr_t *attr);
加锁:
int pthread_mutex_lock(pthread_mutex_t *mutex);
解锁:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
销毁锁:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
练习题:
主线程负责接收用户输入, 函数线程统计用户输入的字符个数。
char buff[128]={0};
pthread_mutex_t mutex;
void *pthread_fun(void *arg)
{
while(1)
{
pthread_mutex_lock(&mutex); //函数线程加锁(必须在主线程之后);
int count=0;
while(1)
{
if(buff[count]==0 || buff[count]=='\n')
{
break;
}
count++;
}
printf("count==%d\n",count);
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
void main()
{
pthread_t id;
pthread_mutex_init(&mutex,NULL);
pthread_mutex_lock(&mutex); //主线程加锁;
int res=pthread_create(&id,NULL,pthread_fun,NULL);
assert(res==0);
while(1)
{
printf("please input:\n");
fflush(stdout);
fgets(buff,128,stdin); //主线程获取用户输入;
pthread_mutex_unlock(&mutex);
if(strncmp(buff,"end",3)==0)
{
break;
}
sleep(1);
pthread_mutex_lock(&mutex);
}
pthread_mutex_unlock(& mutex);
pthread_join(id,NULL);
pthread_mutex_destroy(& mutex);
}