linux学习第30天(线程同步和锁)

线程同步

        协同步调,对公共区域数据按序访问。防止数据混乱,产生与时间有关的错误。

数据混乱的原因

  1. 资源共享(独享资源则不会)

  2. 调度随机(意味着数据访问会出现竞争)

  3. 线程间缺乏必要同步机制

锁的使用

        建议锁!对公共数据进行保护。所有线程【应该】在访问公共数据前先拿锁再访问。但,锁本身不具备强制性。

主要应用函数:

    pthread_mutex_init       函数:创建锁

    pthread_mutex_destory    函数:初始化

    pthread_mutex_lock       函数:加锁

    pthread_mutex_trylock    函数:

    pthread_mutex_unlock     函数:解锁

以上5个函数的返回值都是:成功返回0,失败返回错误号

、、、、、、、、、、、

pthread_mutex_t 类型,其本质是一个结构体。为简化理解,应用时可忽略其实现细节,简单当成整数看待

pthread_mutex_t mutex;变量mutex只有两种取值:0,1

、、、、、、、

使用mutex(互斥量、互斥锁)一般步骤:

    pthread_mutex_t 类型。

    1. pthread_mutex_t lock;  创建锁

    2  pthread_mutex_init; 初始化      1

    3. pthread_mutex_lock;加锁      1-- --> 0

    4. 访问共享数据(stdout)   

    5. pthrad_mutext_unlock();解锁     0++ --> 1

    6. pthead_mutex_destroy;销毁锁

、、、、、、、、、、、

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr)

这里的restrict关键字,表示指针指向的内容只能通过这个指针进行修改

restrict关键字:

    用来限定指针变量。被该关键字限定的指针变量所指向的内存操作,必须由本指针完成。

初始化互斥量:

       pthread_mutex_t mutex;

       1. pthread_mutex_init(&mutex, NULL);              动态初始化。

       2. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;  静态初始化。

例子:借助互斥锁管理共享数据实现同步

未加锁

加锁

互斥锁使用技巧

注意事项:

       尽量保证锁的粒度, 越小越好。(访问共享数据前,加锁。访问结束【立即】解锁。)

       互斥锁,本质是结构体。 我们可以看成整数。 初值为 1。(pthread_mutex_init() 函数调用成功。)

       加锁: --操作, 阻塞线程。

       解锁: ++操作, 唤醒阻塞在锁上的线程。

       try锁:尝试加锁,成功--。失败,返回。同时设置错误号 EBUSY

死锁

是使用锁不恰当导致的现象:

       1. 对一个锁反复lock。

       2. 两个线程,各自持有一把锁,请求另一把。

第一种情况,反复加锁;

第二种情况,1先拿A锁,2先拿B锁,1又要拿B,2又要拿A,就都在这阻塞等待。

读写锁

特性:

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

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

        读写锁非常适合于对数据结构读的次数远大于写的情况。

、、、、、、、、、、、、

    锁只有一把。以读方式给数据加锁——读锁。以写方式给数据加锁——写锁。

    读共享,写独占。

    写锁优先级高。(两个写,一个读,等两个写结束再读)

    相较于互斥量而言,当读线程多的时候,提高访问效率

    pthread_rwlock_t  rwlock;

    pthread_rwlock_init(&rwlock, NULL);

    pthread_rwlock_rdlock(&rwlock);    try

    pthread_rwlock_wrlock(&rwlock);    try

    pthread_rwlock_unlock(&rwlock);

    pthread_rwlock_destroy(&rwlock);

以上函数都是成功返回0,失败返回错误号。

pthread_rwlock_t 类型    用于定义一个读写锁变量

pthread_rwlock_t  rwlock

例子

3个线程不定时 "全局资源,5个线程不定时 "同一全局资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值