linux多线程服务器编程(全方面了解linux多线程服务)(7/13)

来源:国外服务器 在您之前已被浏览:1 次
导读:目前正在解读《linux多线程服务器编程(全方面了解linux多线程服务)(7/13)》的相关信息,《linux多线程服务器编程(全方面了解linux多线程服务)(7/13)》是由用户自行发布的知识型内容!下面请观看由(国外主机 - www.2bp.net)用户发布《linux多线程服务器编程(全方面了解linux多线程服务)(7/13)》的详细说明。
笨笨网美国主机,w ww.2 b p .n e t

在上述代码中,一定会出现死锁,线程1拿到了互斥锁1,又再去申请线程2的互斥锁2,线程2拿到了互斥锁2又再去申请线程1的互斥锁1。

开始调试:

1、找到进程号

linux多线程服务器编程(全方面了解linux多线程服务)(7/13)


2、开始调试

linux多线程服务器编程(全方面了解linux多线程服务)(7/13)


3、查看多个线程堆栈

linux多线程服务器编程(全方面了解linux多线程服务)(7/13)


4、跳转到线程中

linux多线程服务器编程(全方面了解linux多线程服务)(7/13)


5、查看具体调用堆栈

linux多线程服务器编程(全方面了解linux多线程服务)(7/13)


6、查看互斥锁1和互斥锁2,分别被谁拿着

linux多线程服务器编程(全方面了解linux多线程服务)(7/13)


6.9读写锁

6.9.1什么是读写锁?

大部分情况下,对于共享变量的访问特点:只是读取共享变量的值,而不是修改,只有在少数情况下,才会真正的修改共享变量的值。

在这种情况下,读请求之间是同步的,它们之间的并发访问是安全的。然而写请求必须锁住读请求和其它写请求。

即读线程可多个同时读,而写线程只允许同一时间内一个线程去写。

6.9.2读写锁接口

#include //销毁int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);//初始化int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);

linux多线程服务器编程(全方面了解linux多线程服务)(7/13)


读写锁的默认属性:

linux多线程服务器编程(全方面了解linux多线程服务)(7/13)


对于调用pthread_rwlock_init初始化的读写锁,在不需要读写锁的时候,需要调用pthread_rwlock_destroy销毁。

6.9.3读者加锁

#include int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); //阻塞类型的读加锁接口int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock); //非阻塞类型的读加锁接口

最大的好处就是,允许多个线程以只读加锁的方式获取到读写锁;

本质上,读写锁的内部维护了一个引用计数,每当线程以读方式获取读写锁时,该引用计数+1;

当释放以读加锁的方式的读写锁时,会先对引用计数进行-1,直到引用计数的值为0的时候,才真正释放了这把读写锁。

6.9.4写者加锁

#include int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);// 非阻塞写int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);//阻塞写

写锁用的是独占模式,如果当前读写锁被某写线程占用着,则不允许任何读锁通过请求,也不允许任何写锁请求通过,读锁请求和写锁请求都要陷入阻塞,直到线程释放写锁。

6.9.5 解锁

#include int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

不论是读者加锁还是写者加锁,都采用该接口进行解释。

读者解锁,只有当引用计数为0的时候,才真正释放了读写锁。

6.9.6读写锁的竞争策略

对于读写锁而言,目前有两种策略,读者优先和携着优先;

读写锁的类型有如下几种:

PTHREAD_RWLOCK_PREFER_READER_NP, //读者优先PTHREAD_RWLOCK_PREFER_WRITER_NP, //很唬人, 但是也是读者优先PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, //写者优先PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_READER_NP

读者优先:读锁来请求可以立即响应,只要有一个读锁没完成,那么写锁就无法写。这种策略是不公平的,极端情况下,写现场很可能被饿死,即线程总是拿不到锁资源。

写者优先:只要线程申请了写锁,那么在写锁后面到来的读锁请求就会统统被阻塞,不能先于写锁拿到锁。

读写锁实现中的变量及含义

linux多线程服务器编程(全方面了解linux多线程服务)(7/13)


对于读请求而言:如果

1. 无线程持有写锁,即_writer = 0.

笨笨网美国主机,w ww.2 b p .n e t
提醒:《linux多线程服务器编程(全方面了解linux多线程服务)(7/13)》最后刷新时间 2025-03-21 11:13:52,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《linux多线程服务器编程(全方面了解linux多线程服务)(7/13)》该内容的真实性请自行鉴别。