c语言 封装跨平台互斥锁头文件

c语言线程类

第一章 跨平台线程
第二章 跨平台互斥锁


文章目录

  • c语言线程类
  • 前言
  • 一、如何实现?
  • 二、完整代码
  • 三、使用示例
    • 1、加锁解锁
    • 2、尝试加锁
  • 总结


前言

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


一、如何实现?

我们其实只需要通过宏定义一套接口就可以了,而不需要自定义线程对象以及函数和实现。
定义一个宏方法在Windows上宏展开是调用win32 api,其他平台则是调用pthread。
如下:

#ifdef _WIN32
#ifndef _WIN32_WINNT
//使用mingw编译时需要此定义。
#define _WIN32_WINNT 0x0600
#endif
#include 
/// @brief 互斥变量
typedef CRITICAL_SECTION Mutex;
/**
 * @brief 创建互斥变量
 * @param mtx 互斥变量,类型为Mutex*
 * @return void无返回
 */
#define mutex_create(mtx) InitializeCriticalSection(mtx)
#else
#include 
typedef pthread_mutex_t Mutex;
#define mutex_create(mtx) {pthread_mutexattr_t attr;pthread_mutexattr_init(&attr);pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);pthread_mutex_init(mtx,&attr);}
#endif

二、完整代码

mutex.h

/***********************************************************************************************************************
 * Copyright (C): 2025-2025, codeofcc. All rights reserved.
 * @file : mutex.h
 * @brief : 通用线程类封装,在Windows上使用win32api,其他平台使用pthread。
 * @author : codeofcc
 * @email : 
 * @version : 1.0.0
 * @date : 2025/6/6 16:34:27
******************************************************************************************************************/
#ifndef MUTEX_H
#define MUTEX_H
#ifdef _WIN32
#ifndef _WIN32_WINNT
//使用mingw编译时需要此定义。
#define _WIN32_WINNT 0x0600
#endif
#include 
/// @brief 互斥变量,可重入锁
typedef CRITICAL_SECTION Mutex;
/**
 * @brief 创建互斥变量
 * @param mtx 互斥变量,类型为Mutex*
 * @return void无返回
 */
#define mutex_create(mtx) InitializeCriticalSection(mtx)
/**
 * @brief 销毁互斥变量
 * @param mtx 互斥变量,类型为Mutex*
 * @return void无返回
 */
#define mutex_destroy(mtx) DeleteCriticalSection(mtx)
/**
 * @brief 加锁
 * @param mtx 互斥变量,类型为Mutex*
 * @return void无返回
 */
#define mutex_lock(mtx)  EnterCriticalSection(mtx)
/**
 * @brief 尝试加锁
 * @param mtx 互斥变量,类型为Mutex*
 * @return BOOL 成功返回1,失败返回0
 */
#define mutex_trylock(mtx)  TryEnterCriticalSection(mtx)
/**
 * @brief 解锁
 * @param mtx 互斥变量,类型为Mutex*
 * @return void无返回
 */
#define mutex_unlock(mtx)  LeaveCriticalSection(mtx)
#else
#include 
typedef pthread_mutex_t Mutex;
#define mutex_create(mtx) {pthread_mutexattr_t attr;pthread_mutexattr_init(&attr);pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);pthread_mutex_init(mtx,&attr);}
#define mutex_destroy(mtx) pthread_mutex_destroy(mtx)
#define mutex_lock(mtx)  pthread_mutex_lock(mtx)
#define mutex_trylock(mtx)  pthread_mutex_trylock(mtx)==0
#define mutex_unlock(mtx)  pthread_mutex_unlock(mtx)    
#endif
#endif

三、使用示例

1、加锁解锁

#include"mutex.h"
int main()
{
    Mutex mutex;
    //初始化锁
	mutex_create(&mutex);
	//加锁
	mutex_lock(&mutex);
	//解锁
	mutex_unlock(&mutex);
	//反初始化锁
	mutex_destroy(&mutex);
	return 0;
}

2、尝试加锁

#include"mutex.h"
int main()
{
    Mutex mutex;
    //初始化锁
	mutex_create(&mutex);
	//加锁,不会阻塞,成功返回1失败返回0
	if (!mutex_trylock(&mutex))
	{
		printf("get lock fail error \n");
		return;
	}
	//解锁
	mutex_unlock(&mutex);
	//反初始化锁
	mutex_destroy(&mutex);
	return 0;
}

总结

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

你可能感兴趣的:(c语言)