封装pthread_rwlock读写锁,实现嵌套调用

本文介绍了一种基于pthread_rwlock的嵌套读写锁实现,允许读写锁嵌套调用,解决了多线程环境下API间调用关系复杂的问题。

pthread_rwlock简介

pthread_rwlock 读写锁与pthread_mutex类似,但rwlock允许更高的并行性。mutex只有两种状态:加锁状态,不加锁状态,而且一次只有一个线程对其加锁。
rwlock可以有三种状态:读取模式加锁状态,写入模式加锁状态,不加锁状态。
在写入模式加锁时与mutex一样,是独占的,一次只有一个线程可以占有写模式的读写锁。
在读取模式加锁状态,允许多个线程可用同时共享读模式的读写锁。

rwlock嵌套调用

何为嵌套调用?
函数A中有申请/释放锁的调用,函数B也有申请/释放锁的调用。而且A在加锁状态会调用B,这样对于锁就来说就会在已经加锁的状态下再次申请加锁,这就是嵌套调用。

根据POSIX 的定义,rwlock的读取锁允许在同一个线程中嵌套调用,但写入锁不允许嵌套调用。并且写入锁与读取锁是互斥的,所以在写入锁状态下不可以再申请读取锁,反之在读取错状态下也不能再申请写入锁。

不允许读取模式下调用写入锁,这个可以理解,但pthread_rwlock不允许嵌写入锁套调用,在实际应用中挺麻烦的。对于一个应用中可能有多个API申请rwlock锁,这些API之间又互相有调用关系,这里如果能允许rwlock嵌套调用,程序设计上会简单许多。

为了解决这个问题,我基于线程局部变量(thread local storage)对pthread_rwlock又封装了一层,实现允许嵌套调用的nest_rwlock
nest_rwlock不仅允许读取锁嵌套调用,也允许写入锁嵌套调用,还允许在写入锁状态嵌套调用读取锁。实现原理就是利用TLS变量记录当前线程的读取锁和写入锁的嵌套计数,根据嵌套计数决定是否执行加锁解锁(pthread_rwlock_wrlock,pthread_rwlock_unlock),对于写入锁状态下,本来就是独占模式,本就不需要申请读取锁,所以只要当线程知道自己的加锁状态,就可以判断是否执行加锁解锁。

实现nest_rwlock所用的数据结构很简单,如下:

typedef struct _nest_rwlock_t{
	int rd_nest; /** 读取锁嵌套计数 */
	int wr_nest; /** 写入锁嵌套计数 */
	pthread_rwlock_t* rwlock;
}nest_rwlock_t;

rd_nest,wr_nest分别记录当前线程下读取锁和写入锁的嵌套计数,每次加锁,对应的计数器会加1,解锁时计数器会减1.
对于写入锁,当执行加锁时,会判断,wr_nest是否为0,为0时,代表是最外层的申请,这时会执行pthread_rwlock_wrlock执行加锁,否则只会将wr_nest加1,解锁时也一样,先将wr_nest减1,然后判断wr_nest是否为0,为0代表已经是嵌套调用的最外层,这时才执行pthread_rwlock_unlock.
对于读取锁,因为pthread_rwlock本身就支持嵌套调用,所以每次调用加锁都会执行pthread_rwlock_rdlock,同时计数器加1,解锁时也同样会执行pthread_rwlock_unlock并将计数器减1.但rd_nest并不是无用的,它代表了rwlock的加锁状态,当rd_nest不为0时代表rwlock在读取锁状态.
同样的道理当wr_nest不为0时代表rwlock在写入锁状态。
如果两个计数器都为0,代表rwlock在不加锁状态。
如果两个计数器都不为0,那程序的逻辑肯定错了。

NOTE:
nest_rwlock_t对象在使用时必须定义为TLS变量(thread local storage)才能正确工作。参见后面的调用示例。

实现代码

下面是实现代码,详见代码中的注释。
nest_rwlock.c

/*
 * nest_rwlock.c
 *
 *  Created on: Oct 8, 2018
 *      Author: gyd
 */

#include <errno.h>
#include "nest_rwlock.h"
/**
 * @brief 对象初始化
 * 本函数不负责对 pthread_rwlock_t 对象的初始化
 * @param nest_rwlock
 * @param rwlock 已始化的 pthread_rwlock_t 对象
 * @return 0 if success,otherwise error code
 */
int nest_rwlock_init(nest_rwlock_t*nest_rwlock,pthread_rwlock_t* rwlock)
{
	int ret = 0;
	if(NULL == nest_rwlock || NULL == rwlock)return EINVAL;
	/** 不为NULL 代表已经初始化直接返回 */
	if(nest_rwlock->rwlock) return 0;
	nest_rwlock->rwlock = rwlock;
	nest_rwlock->rd_nest = 0;
	nest_rwlock->wr_nest = 0;
	return ret;
}
/**
 * @brief 对象销毁
 * 每个线程都要执行,本函数不负责对 pthread_rwlock_t 对象的销毁
 * @param nest_rwlock
 * @return 0 if success,otherwise error code
 */
int nest_rwlock_destroy(nest_rwlock_t*nest_rwlock)
{
	if(NULL == nest_rwlock)
		return EINVAL;
	nest_rwlock->rd_nest = 0;
	nest_rwlock->wr_nest = 0;
	nest_rwlock->rwlock = NULL;
	return 0;
}
/**
 * 获取读取锁
 * @param nest_rwlock
 * @return 返回 pthread_rwlock_rdlock 的返回值
 */
int nest_rwlock_rdlock(nest_rwlock_t*nest_rwlock)
{
	int ret;
	if(NULL == nest_rwlock)
		return EINVAL;
	/** 写锁状态下为独占资源不需要再加读取锁,直接返回 */
	if(nest_rwlock->wr_nest)
		return 0;

	/** 加锁成功计嵌套数器加1 */
	if(0 == (ret = pthread_rwlock_rdlock(nest_rwlock->rwlock)))
		++ nest_rwlock->rd_nest;
	return ret;
}
/**
 * 释放读取锁
 * @param nest_rwlock
 * @return 返回 pthread_rwlock_unlock 的返回值
 */
int nest_rwlock_rdunlock(nest_rwlock_t*nest_rwlock)
{
	int ret;
	if(NULL == nest_rwlock)
		return EINVAL;
	/** 写锁状态下没有加读取锁,直接返回 */
	if(nest_rwlock->wr_nest)
		return 0;
	/** 未加锁状态报错 */
	if(0 == nest_rwlock->rd_nest)
		return EPERM;

	/** 解锁成功计嵌套数器减1 */
	if(0 == (ret = pthread_rwlock_unlock(nest_rwlock->rwlock)))
		-- nest_rwlock->rd_nest;
	return ret;
}
/**
 * 获取写入锁
 * @param nest_rwlock
 * @return 返回 pthread_rwlock_wrlock 的返回值
 */
int nest_rwlock_wrlock(nest_rwlock_t*nest_rwlock)
{
	int ret = 0;
	if(NULL == nest_rwlock)
		return EINVAL;
	/** 已经加读取锁时报错 */
	if(nest_rwlock->rd_nest)
		return EDEADLK;

	/** 写入锁嵌套计数为0时执行解锁,否则直接将嵌套计数器减1 */
	if(0 == nest_rwlock->wr_nest)
		ret = pthread_rwlock_wrlock(nest_rwlock->rwlock);
	if(0 == ret)
		++ nest_rwlock->wr_nest;
	return ret;
}
/**
 * 释放写入锁
 * @param nest_rwlock
 * @return 返回 pthread_rwlock_unlock 的返回值
 */
int nest_rwlock_wrunlock(nest_rwlock_t*nest_rwlock)
{
	int ret = 0;
	if(NULL == nest_rwlock)
		return EINVAL;
	/** 已经加读取锁时报错 */
	if(nest_rwlock->rd_nest)
		return EDEADLK;
	/** 未加锁状态报错 */
	if(0 == nest_rwlock->wr_nest)
		return EPERM;
	-- nest_rwlock->wr_nest;
	/** 写入嵌套计数器为0时执行解锁 */
	if(0 == nest_rwlock->wr_nest)
		ret = pthread_rwlock_unlock(nest_rwlock->rwlock);

	return ret;
}
/**
 * 自动判断读写锁状态执行对应的解锁函数(pthread_rwlock_unlock,pthread_rwlock_unlock)
 * @param nest_rwlock
 * @return
 */
int nest_rwlock_unlock(nest_rwlock_t*nest_rwlock)
{
	if(NULL == nest_rwlock)
		return EINVAL;
	/** 已经加读取锁时执行读取锁解锁 */
	if(nest_rwlock->rd_nest && 0 == nest_rwlock->wr_nest)
		return nest_rwlock_rdunlock(nest_rwlock);
	/** 已经加写入锁时执行写入锁解锁 */
	if(nest_rwlock->wr_nest && 0 == nest_rwlock->rd_nest)
		return nest_rwlock_wrunlock(nest_rwlock);
	return EPERM;
}

nest_rwlock.h

/*
 * nest_rwlock.h
 *
 *  Created on: Oct 8, 2018
 *      Author: gyd
 */

#ifndef SRC_CORE_THREADSAFE_NEST_RWLOCK_H_
#define SRC_CORE_THREADSAFE_NEST_RWLOCK_H_
#include <pthread.h>

/**
 * @brief 基于 pthread_rwlock_t 实现读写锁嵌套调用封装
 * 读写锁都可以嵌套调用,
 * 写入锁状态下可以嵌套调用读取锁,读取锁状态下不可嵌套调用写入锁
 * 必须定义为TLS变量(thread local storage)
 */
typedef struct _nest_rwlock_t{
	int rd_nest; /** 读取锁嵌套计数 */
	int wr_nest; /** 写入锁嵌套计数 */
	pthread_rwlock_t* rwlock;
}nest_rwlock_t;

#ifdef __cplusplus
extern "C" {
#endif
int nest_rwlock_init(nest_rwlock_t*nest_rwlock,pthread_rwlock_t* rwlock);

int nest_rwlock_destroy(nest_rwlock_t*nest_rwlock);

int nest_rwlock_rdlock(nest_rwlock_t*nest_rwlock);

int nest_rwlock_rdunlock(nest_rwlock_t*nest_rwlock);

int nest_rwlock_wrlock(nest_rwlock_t*nest_rwlock);

int nest_rwlock_wrunlock(nest_rwlock_t*nest_rwlock);

int nest_rwlock_unlock(nest_rwlock_t*nest_rwlock);
#ifdef __cplusplus
}
#endif
#endif /* SRC_CORE_THREADSAFE_NEST_RWLOCK_H_ */

测试程序及调用示例

测试程序及调用示例, linux gcc,windows MSVC/MinGW测试通过,windows 下MSVC编译需要POSIX Threads (pthreads) for Win32支持。
test_rwlock.c

/*
 * test_rwlock.c
 *
 *  Created on: Oct 8, 2018
 *      Author: gyd
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "nest_rwlock.h"

#if _MSC_VER
#define __TLS __declspec(thread)
#else
#define __TLS __thread
#endif
#define MAXDATA     1024
#define MAXREDER    100
#define MAXWRITER   100
struct
{
    pthread_rwlock_t   rwlock;
    char datas[MAXDATA];
} shared;
/** TLS变量 */
static __TLS nest_rwlock_t tls_lock;
static inline int is_empty_line(const char*str)
{
	return 0 == strcmp(str,"\n") || 0 == strcmp(str,"\r\n");
}
/** 返回当前线程id */
static inline unsigned int pthread_id()
{
#ifdef PTW32_VERSION
	/** 使用 prthread for win32 版本的pthread*/
	return pthread_getw32threadid_np(pthread_self());
#else
	return (unsigned int)pthread_self();
#endif
}
/**  统计shared.datas中的单词数量,用于嵌套测试 */
static int world_count()
{
	nest_rwlock_init(&tls_lock,&shared.rwlock);
	nest_rwlock_rdlock(&tls_lock);
    const char* str = shared.datas;
    const char* sep = " \n,!;?:+";

    unsigned int cnt = 0;
    do {
       str = strpbrk(str, sep); // find separator
       if(str) str += strspn(str, sep); // skip separator
       ++cnt; // increment word count
    } while(str && *str);
	nest_rwlock_unlock(&tls_lock);
	return cnt;
}
static void *reader(void *arg)
{
	int emp;
	printf("Reader beginning read message.thread 0x%x\n",pthread_id());
	/** 初始化tls变量 */
	nest_rwlock_init(&tls_lock,&shared.rwlock);

	const char* str = shared.datas;
	do
	{
		nest_rwlock_rdlock(&tls_lock);
		if(!(emp = is_empty_line(str)) && strlen(str))
		{
			printf("thread 0x%x Read message is: %s\n",pthread_id(),str);
			str += strlen(str);
	        /** 嵌套调用测试 */
	        printf("total %u words in shared buffer\n", world_count());
		}
		nest_rwlock_unlock(&tls_lock);
		 /** 输入空行结束循环  */
	}while(!emp);
	printf("Reader stope.thread 0x%x\n",pthread_id());
    return NULL;
}

static void *writer(void *arg)
{
    char datas[MAXDATA];
    printf("Writers beginning write message.thread 0x%x\n",pthread_id());
    /** 初始化tls变量 */
   	nest_rwlock_init(&tls_lock,&shared.rwlock);

    do
    {
        printf("Enter the write message: thread:0x%x\n",pthread_id());
        fgets(datas,sizeof(datas),stdin);
        nest_rwlock_wrlock(&tls_lock);
        strcat(shared.datas,datas);
        /** 嵌套调用测试 */
        printf("total %u words in shared buffer\n", world_count());
        nest_rwlock_unlock(&tls_lock);
        /** 输入空行结束循环  */
    }while(! is_empty_line(datas));
    printf("Writers stop.thread 0x%x\n",pthread_id());

    return NULL;
}

int main(int argc,char *argv[])
{
    int i,reader_count,writer_count;
    pthread_t tid_reader[MAXREDER],tid_writer[MAXWRITER];
    if(argc != 3)
    {
        printf("usage : test_rwlock  ${readercount} ${writercount}\n"
        		"    Enter empty line to finish program \n");
        exit(0);
    }
    reader_count = atoi(argv[1]);
    writer_count = atoi(argv[2]);
    printf("reader_count=%d,writer_count=%d\n",reader_count,writer_count);
    pthread_rwlock_init(&shared.rwlock,NULL);
    /** 启动写线程 */
    for(i=0; i<writer_count; ++i)
        pthread_create(&tid_writer[i],NULL,writer,NULL);
    /** 启动读线程 */
    for(i=0; i<reader_count; ++i)
        pthread_create(&tid_reader[i],NULL,reader,NULL);
    for(i=0; i<writer_count; ++i)
        pthread_join(tid_writer[i],NULL);
    for(i=0; i<reader_count; ++i)
        pthread_join(tid_reader[i],NULL);
    pthread_rwlock_destroy(&shared.rwlock);
    exit(0);
}

参考资料

http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_rwlock_rdlock.html
http://pubs.opengroup.org/onlinepubs/009696899/basedefs/pthread.h.html
https://www.cnblogs.com/diegodu/p/3890450.html

<think>首先,用户的问题是关于多线程环境下使用pthread_rwlock_rdlock实现读写锁的。具体是:pthread_rwlock_rdlock 多线程 读写锁 实现原理 使用方法。 我需要根据系统级指令来构建回答: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 用户可见层的指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 - 参考提供的站内引用。 提供的引用: - [^1]: 关于读写锁的状态、特性、函数等。 - [^2]: 获取读锁的函数:pthread_rwlock_rdlock(阻塞式)和pthread_rwlock_tryrdlock(非阻塞式)。 - [^3]: 函数功能解释:pthread_rwlock_rdlock加读锁,pthread_rwlock_wrlock加写锁,pthread_rwlock_unlock解锁。 回答结构: 1. **介绍读写锁的概念**:解释什么是读写锁,为什么在多线程环境中使用。 2. **实现原理**:基于pthread_rwlock实现原理。 3. **使用方法**:详细说明如何使用pthread_rwlock_rdlock函数,包括初始化和使用步骤。 4. **代码示例**:提供C语言代码示例,展示如何实现。 5. **注意事项**:讨论死锁、性能等问题。 6. **生成相关问题**:在最后添加相关问题。 确保使用中文。 现在,整合引用: - 引用[^1]提到读写锁状态和函数。 - 引用[^2]解释pthread_rwlock_rdlock函数。 - 引用[^3]解释函数功能。 我需要在回答中自然地添加引用标识,例如在解释函数时引用。 回答大纲: 1. **读写锁简介** - 解释读写锁的作用:允许多个读线程同时访问,但只允许一个写线程访问。 - 引用[^1]提到读写锁状态:可能包括读锁、写锁状态。 2. **实现原理** - 基于pthread实现:使用pthread_rwlock_t结构体。 - 内部机制:如何管理读锁和写锁的竞争。 - 可能涉及数学表达式,比如锁的状态计数。 3. **pthread_rwlock_rdlock的使用方法** - 初始化:使用pthread_rwlock_init。 - 加读锁:pthread_rwlock_rdlock(阻塞式)。 - 解锁:pthread_rwlock_unlock。 - 非阻塞选项:pthread_rwlock_tryrdlock。 - 销毁:pthread_rwlock_destroy。 - 引用[^2]和[^3]在解释函数时。 4. **代码示例** - 提供一个简单的C代码示例,展示多线程中使用读写锁。 5. **注意事项** - 死锁风险:避免在持有锁时调用其他可能阻塞的函数。 - 性能考虑:读写锁在读写比例高时性能好。 - 引用相关概念。 6. **相关问题** - 生成3-5个相关问题,基于用户查询。 数学表达式:如果涉及原理,比如锁的计数,可以使用行内数学,例如状态变量计数。 例如,实现原理中,读写锁可能维护一个计数器:读锁计数$r$,当$r > 0$时,读锁被持有;写锁请求时需$r=0$。使用$...$格式。 独立公式:如果有必要,比如一个公式描述锁的条件,使用$$...$$。 最后,生成相关问题: 1. 如何避免读写锁中的死锁? 2. pthread_rwlock_wrlock的使用方法是什么? 3. 读写锁与互斥锁的区别是什么? 4. 在什么场景下使用读写锁更有效? 确保回答真实可靠:基于标准pthread库知识。</think>### 多线程环境下使用 pthread_rwlock_rdlock 实现读写锁 读写锁是一种线程同步机制,允许多个线程同时读取共享资源(读锁),但只允许一个线程写入资源(写锁)。这显著提高了多线程程序的性能,尤其在读操作远多于写操作的场景下(例如数据库或文件系统)[^1]。下面,我将逐步解释 `pthread_rwlock_rdlock` 的实现原理、使用方法,并提供代码示例。 --- ### 1. 读写锁实现原理 读写锁的核心原理基于状态管理:它维护一个计数器来跟踪当前持有读锁的线程数量。实现通常涉及以下机制: - **状态变量**:读写锁使用一个共享变量(如 `pthread_rwlock_t` 结构体)存储状态。读锁被持有时,计数器$r$递增($r \geq 0$);写锁请求需等待$r = 0$时才被授予[^1]。 - **竞争控制**: - 当线程调用 `pthread_rwlock_rdlock` 时,如果当前无写锁(即$r \geq 0$),读锁立即被授予,$r$增加1。 - 如果写锁被持有($r < 0$ 或标志位指示写锁活跃),读线程被阻塞,直到写锁释放。 - **公平性与优先级**:标准实现通常采用“读优先”或“写优先”策略。Linux 的 pthread 库默认偏向读优先,但可通过属性设置调整[^3]。 - **数学基础**:锁的状态可用一个整数表示: $$ S = \begin{cases} r & \text{(读模式,} r > 0\text{)} \\ -1 & \text{(写模式)} \end{cases} $$ 其中,$S$ 的值为正时允许多个读锁,为负时禁止读写操作[^1]。 这种设计减少了线程竞争,提升了并发性,但需注意死锁风险(如线程在持有读锁时尝试获取写锁)。 --- ### 2. pthread_rwlock_rdlock 的使用方法 `pthread_rwlock_rdlock` 是 POSIX 线程库提供的函数,用于以阻塞方式获取读锁。其函数原型为: ```c int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); ``` - **参数**:`rwlock` 是指向读写锁对象的指针。 - **返回值**:成功时返回 0;错误时返回错误码(如 `EBUSY` 表示锁不可用,但此函数通常阻塞直至成功)[^2]。 #### 使用步骤: 1. **初始化读写锁**:使用 `pthread_rwlock_init` 创建锁对象。 2. **加读锁**:在需要读取共享资源的线程中调用 `pthread_rwlock_rdlock`。如果写锁被持有,线程阻塞。 3. **访问资源**:安全地执行读操作。 4. **解锁**:使用 `pthread_rwlock_unlock` 释放锁。 5. **销毁锁**:使用 `pthread_rwlock_destroy` 清理资源[^1]。 #### 非阻塞替代方案: - `pthread_rwlock_tryrdlock`:非阻塞版本,立即返回。如果锁不可用,返回 `EBUSY`,避免线程等待[^2]。 - 适用场景:当线程需避免阻塞时(如实时系统)。 #### 注意事项: - **死锁预防**:确保线程在持有读锁时不尝试获取写锁(否则可能导致死锁)。使用超时机制或锁属性调整。 - **性能优化**:在读写比例高(如读操作占 80% 以上)时,读写锁性能优于互斥锁;否则,互斥锁更简单高效[^3]。 - **错误处理**:始终检查返回值,避免未定义行为。 --- ### 3. 代码示例:多线程读写锁实现 以下是一个简单的 C 语言示例,展示如何在多线程环境中使用 `pthread_rwlock_rdlock` 实现读写锁。该程序模拟多个读线程和一个写线程访问共享数据。 ```c #include <stdio.h> #include <pthread.h> // 共享资源 int shared_data = 0; pthread_rwlock_t rwlock; // 读写锁对象 // 读线程函数 void* reader_thread(void* arg) { int id = *(int*)arg; pthread_rwlock_rdlock(&rwlock); // 获取读锁(阻塞式) printf("Reader %d: read data = %d\n", id, shared_data); pthread_rwlock_unlock(&rwlock); // 释放锁 return NULL; } // 写线程函数 void* writer_thread(void* arg) { pthread_rwlock_wrlock(&rwlock); // 获取写锁 shared_data++; // 修改共享数据 printf("Writer: updated data to %d\n", shared_data); pthread_rwlock_unlock(&rwlock); // 释放锁 return NULL; } int main() { pthread_t readers[3], writer; int ids[] = {1, 2, 3}; // 初始化读写锁 pthread_rwlock_init(&rwlock, NULL); // 创建写线程(一个) pthread_create(&writer, NULL, writer_thread, NULL); // 创建读线程(多个) for (int i = 0; i < 3; i++) { pthread_create(&readers[i], NULL, reader_thread, &ids[i]); } // 等待所有线程结束 pthread_join(writer, NULL); for (int i = 0; i < 3; i++) { pthread_join(readers[i], NULL); } // 销毁锁 pthread_rwlock_destroy(&rwlock); return 0; } ``` #### 代码说明: - **读线程**:调用 `pthread_rwlock_rdlock` 安全读取 `shared_data`,多个读线程可同时执行。 - **写线程**:使用 `pthread_rwlock_wrlock` 独占访问,修改数据。 - **输出示例**:可能显示读线程并行读取,而写线程阻塞读操作直至完成[^3]。 编译命令:`gcc -o rwlock_example rwlock_example.c -lpthread` --- ### 4. 关键注意事项 - **线程安全**:确保所有访问共享资源的线程都使用同一读写锁对象。 - **属性设置**:通过 `pthread_rwlockattr_t` 调整锁属性(如优先级策略),避免饥饿问题[^1]。 - **资源泄漏**:始终配对调用 `init/destroy` 和 `lock/unlock`,防止内存泄漏或未定义行为。 - **性能监控**:在高并发场景,使用工具(如 Valgrind)检测锁竞争。 读写锁是高效的多线程同步工具,但需结合场景选择。例如,在实时系统中,非阻塞函数(`pthread_rwlock_tryrdlock`)更可靠[^2]。 --- ### 相关问题 1. 如何避免读写锁中的死锁? 2. pthread_rwlock_wrlock 的使用方法及与读锁的区别是什么? 3. 读写锁与互斥锁(pthread_mutex)的性能对比如何? 4. 在 Linux 中,如何设置读写锁的属性以实现写优先策略? [^1]: 读写锁状态包括读锁和写锁模式,通过计数器管理并发访问。主要函数如 `pthread_rwlock_init` 和 `pthread_rwlock_rdlock` 实现初始化和加锁操作。 [^2]: `pthread_rwlock_rdlock` 以阻塞方式获取读锁,如果写锁被持有,线程会等待;非阻塞版本 `pthread_rwlock_tryrdlock` 返回 `EBUSY` 而不阻塞。 [^3]: 读写锁函数的功能包括:读锁允许多线程并发,写锁独占资源;解锁操作通用。死锁风险需通过设计避免。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值