c语言 封装跨平台读写锁头文件

c语言线程类

第一章 跨平台线程
第二章 跨平台互斥锁
第三章 跨平台信号量
第四章 跨平台条件变量
第五章 跨平台读写锁(本章)
第六章 整合版


文章目录


前言

c语言的标准库是没有线程类的,不同平台的使用方式都有所不同,Windows上通常用win32 api,其他平台则是pthread。当想要写通用的跨平台代码时,涉及到多线程以及线程安全操作就会很不方便。笔者以前写过跨平台线程类的封装,自定义了一套接口和实现,能使用但是还不是最方便的。比如写项目的时候还是需要在cmakelist中加入.c文件的。本文的做法是进一步简化,只需要一个头文件就能实现跨平台的信号量封装。


一、如何实现?

我们其实只需要通过宏定义一套接口就可以了,而不需要自定义线程对象以及函数和实现。

定义一个宏方法在Windows上宏展开是调用win32 api,其他平台则是调用pthread。

如下:

cpp 复制代码
#ifdef _WIN32
#ifndef _WIN32_WINNT
//使用mingw编译时需要此定义。
#define _WIN32_WINNT 0x0600
#endif
#include <windows.h>
/// @brief 读写锁
typedef SRWLOCK RWMutex; 
/**
 * @brief 初始化读写锁
 * @param mtx 读写锁变量,类型为RWMutex*
 * @return void无返回
 */
#define rwmutex_create(mtx) InitializeSRWLock(mtx)
#else
#include <pthread.h>
typedef pthread_rwlock_t RWMutex; 
#define rwmutex_create(mtx) pthread_rwlock_init(mtx,0)
#endif

二、完整代码

rwmutex.h

c 复制代码
/***********************************************************************************************************************
 * Copyright (C): 2025-2025, codeofcc. All rights reserved.
 * @file : sem.h
 * @brief : 通用线程类封装,在Windows上使用win32api,其他平台使用pthread。
 * @author : codeofcc
 * @email :
 * @version : 1.0.0
 * @date : 2025/6/6 16:34:27
 ******************************************************************************************************************/
#ifndef RWMUTEX_H
#define RWMUTEX_H
#ifdef _WIN32
#ifndef _WIN32_WINNT
// 使用mingw编译时需要此定义。
#define _WIN32_WINNT 0x0600
#endif
#include <windows.h>
/// @brief 读写锁
typedef SRWLOCK RWMutex; 
/**
 * @brief 初始化读写锁
 * @param mtx 读写锁变量,类型为RWMutex*
 * @return void无返回
 */
#define rwmutex_create(mtx) InitializeSRWLock(mtx)
/**
 * @brief 销毁读写锁
 * @param mtx 读写锁变量,类型为RWMutex*
 * @return void无返回
 */
#define rwmutex_destroy(mtx) 
/**
 * @brief 获取写锁,阻塞直到获取锁为止
 * @param mtx 读写锁变量,类型为RWMutex*
 * @return void无返回
 */
#define rwmutex_lock(mtx)  AcquireSRWLockExclusive(mtx)
/**
 * @brief 尝试获取写锁,不阻塞
 * @param mtx 读写锁变量,类型为RWMutex*
 * @return BOOL 成功返回1,失败返回0
 */
#define rwmutex_trylock(mtx)  TryAcquireSRWLockExclusive(mtx)
/**
 * @brief 释放写锁
 * @param mtx 读写锁变量,类型为RWMutex*
 * @return void无返回
 */
#define rwmutex_unlock(mtx)  ReleaseSRWLockExclusive(mtx)
/**
 * @brief 获取读锁,阻塞直到获取锁为止
 * @param mtx 读写锁变量,类型为RWMutex*
 * @return void无返回
 */
#define rwmutex_read_lock(mtx)  AcquireSRWLockShared(mtx)
/**
 * @brief 尝试获取读锁,不阻塞
 * @param mtx 读写锁变量,类型为RWMutex*
 * @return BOOL 成功返回1,失败返回0
 */
#define rwmutex_read_trylock(mtx)  TryAcquireSRWLockShared(mtx)
/**
 * @brief 释放读锁
 * @param mtx 读写锁变量,类型为RWMutex*
 * @return void无返回
 */
#define rwmutex_read_unlock(mtx)  ReleaseSRWLockShared(mtx)
#else
#include <pthread.h>
typedef pthread_rwlock_t RWMutex; 
#define rwmutex_create(mtx) pthread_rwlock_init(mtx,0)
#define rwmutex_destroy(mtx) pthread_rwlock_destroy(mtx)
#define rwmutex_lock(mtx)  pthread_rwlock_wrlock(mtx)
#define rwmutex_trylock(mtx)  pthread_rwlock_trywrlock(mtx)==0
#define rwmutex_unlock(mtx)  pthread_rwlock_unlock(mtx)
#define rwmutex_read_lock(mtx)  pthread_rwlock_rdlock(mtx)
#define rwmutex_read_trylock(mtx)  pthread_rwlock_tryrdlock(mtx)==0
#define rwmutex_read_unlock(mtx)  pthread_rwlock_unlock(mtx)
#endif
#endif

三、使用示例

1、多线程读写数据

c 复制代码
#include <string.h>
#include"rwmutex.h"
#include"thread.h"
char buffer[512] = {0};
TINT task(void *arg)
{
	RWMutex *mutex = (RWMutex *)arg;
	while (1)
	{
	  //进入读锁
		rwmutex_read_lock(mutex);
		// 可以多个线程同时读取数据
		printf("%s", buffer);
		if (strcmp(buffer, "hello word!") == 0)
		{
			rwmutex_read_unlock(mutex);
			return 0;
		}
		rwmutex_read_unlock(mutex);
		thread_sleep(30);
	}
	return 0;
}

int main()
{
	RWMutex mutex;
	rwmutex_create(&mutex);
	rwmutex_lock(&mutex);

	Thread thread;
	// 开启线程1
	thread_create(&thread, task, (void *)&mutex);
	thread_detach(thread);
	// 开启线程2
	thread_create(&thread, task, (void *)&mutex);
	thread_detach(thread);

	thread_sleep(1000);
	//进入写锁
	rwmutex_lock(&mutex);
	// 写入数据
	strcat(buffer, "hello word!");
	rwmutex_unlock(&mutex);

	// 销毁资源
	rwmutex_destroy(&mutex);
	printf("rwmutex_test0 passed\n");
}

总结

以上就是今天要讲的内容,本文只是简单将不同平台的读写锁方法进行了一个整合,对函数的参数和返回值做了一个统一。由于在所有实现在头文件中,使用起来是很方便的,不需要额外编写makefile或cmakelist,头文件拷贝到项目就能直接用。

相关推荐
炸膛坦客6 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
程序员Rock13 小时前
上位机开发-MODBUS面试常见问题
c语言·c++·面试·职场和发展·上位机
blevoice18 小时前
抖抖燃脂机单 AC6966B 主控调试踩坑:Type-C 整机供电喇叭无声排障
c语言·开发语言·单片机
小小晓.19 小时前
C++小白记:C风格字符串和数组用法
c语言·开发语言·c++
深念Y19 小时前
开发者如何清理和迁移C盘堆积的垃圾
c语言·开发语言
十月的皮皮20 小时前
STM32从零到量产开发:四路继电器工业控制模块开发实战笔记(小白视角)
c语言·笔记·stm32·stm32cubemx·hal库
不正经学生20 小时前
C 语言函数深入剖析(基础篇)—— 从零理解函数的每一个细节
c语言·开发语言·数据结构·算法·c#
天空'之城21 小时前
C 语言工业级通用组件手写 10:字节序转换
c语言·字节序·大小端·嵌入式通信·工业级组件
C++ 老炮儿的技术栈1 天前
OpenCV 实现社保卡透视矫正:Hough 直线提取四角并转正证件图像
c语言·c++·人工智能·opencv·算法·计算机视觉·c
我叫洋洋1 天前
C ++ [ hello world ]
c语言·c++·算法