首页 > 编程语言 > 详细

线程同步

时间:2021-02-02 19:03:08      阅读:34      评论:0      收藏:0      [点我收藏+]

一. 互斥锁

1. 使用步骤

  1. 创建互斥锁

    pthread_mutex_t mutex;
    
  2. 初始化互斥锁

    pthread_mutex_init(&mutex); 相当于mutex=1;
    
  3. 在临界区添加互斥锁

    pthread_mutex_lock(&mutex);   mutex=0
    [临界区代码]
    pthread_mutex_unlock(&mutex);    mutex=1
    
  4. 释放互斥锁资源

    pthread_mutex_destroy(&mutex);

必须在所有操作共享资源的线程上都加上锁,否则不能起线程同步的作用

2. 例

  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <sys/types.h>
  #include <unistd.h>
  #include <pthread.h>
  #include <time.h>

  //定义一把锁
  pthread_mutex_t mutex;

  void *mythread1(void *args)
  {
  	while(1)
  	{
  		//加锁
      	pthread_mutex_lock(&mutex);

      	printf("hello ");
      	sleep(rand()%3);
      	printf("world\n");
      
  		//解锁
  		pthread_mutex_unlock(&mutex);
  		sleep(rand()%3);
  	}
  
  	pthread_exit(NULL);
  }


  void *mythread2(void *args)
  {
  	while(1)
  	{
  		//加锁
      	pthread_mutex_lock(&mutex);

      	printf("HELLO ");
      	sleep(rand()%3);
      	printf("WORLD\n");

  		//解锁
  		pthread_mutex_unlock(&mutex);
  		sleep(rand()%3);
  	}

  	pthread_exit(NULL);
  }

  int main()
  {
  	int ret;
  	pthread_t thread1;
  	pthread_t thread2;

  	//随机数种子
  	srand(time(NULL));

  	//互斥锁初始化
  	pthread_mutex_init(&mutex, NULL);

  	ret = pthread_create(&thread1, NULL, mythread1, NULL);
  	if(ret!=0)
  	{
  		printf("pthread_create error, [%s]\n", strerror(ret));
  		return -1;
  	}

  	ret = pthread_create(&thread2, NULL, mythread2, NULL);
  	if(ret!=0)
  	{
  		printf("pthread_create error, [%s]\n", strerror(ret));
  		return -1;
  	}

  	//等待线程结束
  	pthread_join(thread1, NULL);
  	pthread_join(thread2, NULL);

  	//释放互斥锁
  	pthread_mutex_destroy(&mutex);
  	return 0;
  }

二. 读写锁

1. 什么是读写锁?

读写锁也叫共享-独占锁,当以读模式锁住时,他是以共享模式锁住的,以写模式锁住时,他是以独占模式锁住的。即读共享,写独占。

2. 读写锁使用场景

读写锁适用于对数据结构读的次数远大于写的情况

3. 读写锁的特性

  • 读写锁是“写模式加锁”时,解锁前,所有对该锁加锁的线程都会被阻塞。
  • 读写锁是“读模式加锁”时,如果线程以读模式对其加锁会成功;如果线程以写模式加锁会阻塞。
  • 读写锁是“读模式加锁”时, 既有试图以写模式加锁的线程,也有试图以读模式加锁的线程。那么读写锁会阻塞随后的读模式锁请求。优先满足写模式锁。读锁、写锁并行阻塞,写锁优先级高。

4. 例

  • 线程A加写锁成功,线程B请求读锁。
    • 线程B阻塞
  • 线程A持有读锁,线程B请求写锁。
    • 线程B阻塞
  • 线程A拥有读锁,线程B请求读锁
    • 线程B加读锁成功
  • 线程A持有读锁,然后线程B请求读锁,线程C请求写锁
    • 线程B、C阻塞, 写锁优先级高
    • 线程A解锁,C写锁加锁成功,C阻塞
    • 线程B解锁,C加读锁成功。

读并行,写独占,写的优先级高

5. 读写锁的主要操作函数

  • 定义一把读写锁

     pthread_rwlock_t rwlock;
    
  • 初始化读写锁

     int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock , const pthread_rwlockattr_t *restrict attr);
    函数参数:
       * rwlock:读写锁       
       * attr:读写锁属性,传NULL为默认属性

线程同步

原文:https://www.cnblogs.com/luyimin/p/14363504.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!