当前位置: 首页 > wzjs >正文

nginx wordpress 403 forbidden51趣优化网络seo工程师教程

nginx wordpress 403 forbidden,51趣优化网络seo工程师教程,cpanel wordpress是什么,开源wiki做网站c语言线程类 第一章 跨平台线程 文章目录 c语言线程类前言一、如何实现?二、完整代码三、使用示例1、创建线程并等待返回2、创建线程并分离 总结 前言 c语言的标准库是没有线程类的,不同平台的使用方式都有所不同,Windows上通常用win32 api…

c语言线程类

第一章 跨平台线程


文章目录

  • c语言线程类
  • 前言
  • 一、如何实现?
  • 二、完整代码
  • 三、使用示例
    • 1、创建线程并等待返回
    • 2、创建线程并分离
  • 总结


前言

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


一、如何实现?

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

#ifdef _WIN32
#include <windows.h>
/*** @brief 创建线程* @param thread 线程句柄,类型为Thread** @param callback 回调方法,格式:TINT thread_callback(void* arg);  thread_callback中的返回类型是整型int,不同平台长度不同所以只能统一为int。* @param arg 回调参数,类型为void** @return 0成功,其他值失败*/
#define thread_create(thread, callback, arg) (*(thread) = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)callback,arg, 0, NULL))==0
#else
#include <pthread.h>
#define thread_create(tid, callback, arg) pthread_create(tid, NULL, (void*(*)(void*))callback, arg)
#endif

二、完整代码

thread.h

/************************************************************************************************************************* Copyright (C): 2025-2025, codeofcc. All rights reserved.* @file : thread.h* @brief : 通用线程类封装,在Windows上使用win32api,其他平台使用pthread。* @author : codeofcc* @email : * @version : 1.0.0* @date : 2025/6/6 16:34:27
******************************************************************************************************************/
#ifndef THREAD_H
#define THREAD_H
#ifdef _WIN32
#ifndef _WIN32_WINNT
//使用mingw编译时需要此定义。
#define _WIN32_WINNT 0x0600
#endif
#include <windows.h>
#include <synchapi.h>
/// @brief 线程句柄
typedef HANDLE Thread;
/// @brief 线程回调的返回定义,仅作为函数定义,不能作为类型。
#define TINT int WINAPI
/*** @brief 创建线程* @param thread 线程句柄,类型为Thread** @param callback 回调方法,格式:TINT thread_callback(void* arg);  thread_callback中的返回类型是整型int,不同平台长度不同所以只能统一为int。* @param arg 回调参数,类型为void** @return 0成功,其他值失败*/
#define thread_create(thread, callback, arg) (*(thread) = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)callback,arg, 0, NULL))==0
/*** @brief 等待线程结束,结束后会销毁线程句柄* @param thread 线程句柄,类型为Thread* @param ret 返回值,类型未int** @return 0成功,其他值失败*/
#define thread_join(thread,ret) WaitForSingleObject(thread, INFINITE); if(ret)GetExitCodeThread(thread,(LPDWORD) ret);CloseHandle(thread)
/*** @brief 分离线程,会销毁线程句柄,但线程依然执行* @param thread 线程句柄,类型为Thread* @return 0成功,其他值失败*/
#define thread_detach(thread) CloseHandle(thread)==0
/*** @brief 获取当前线程id* @return 线程id,类型为unsigned long*/
#define thread_self_id() (unsigned long)GetCurrentThreadId()
/*** @brief 休眠当前线程* @param ms 毫秒数* @return void无返回*/
#define thread_sleep(ms) Sleep(ms)
#else
#include <pthread.h>
#include <sys/time.h>
#include <semaphore.h>
#include <stdint.h>
typedef pthread_t Thread;
#define TINT intptr_t
#define thread_create(tid, callback, arg) pthread_create(tid, NULL, (void*(*)(void*))callback, arg)
#define thread_join(tid,ret) { intptr_t retval;  pthread_join(tid, (void**)&retval); if (ret){*(int*)ret = (int)retval; } }
#define thread_detach(tid) pthread_detach(tid)
#define thread_self_id() (unsigned long)pthread_self()
#define thread_sleep(ms){struct timeval delay = {ms / 1000, (ms % 1000) * 1000}; select(NULL, NULL, NULL, NULL, &delay);}      
#endif
#endif

三、使用示例

1、创建线程并等待返回

#include"thread.h"
#include<stdint.h>
TINT thread_proc(void *arg)
{intptr_t num = (intptr_t)arg;printf("pass arg : %d , thread id : %d\n", (int)num,thread_self_id());//sleep200毫秒thread_sleep(200);// 返回线程idreturn thread_self_id();
}int main()
{//线程句柄Thread thread;int ret;// 创建线程thread_create(&thread, thread_proc, (void *)1);// 等待线程结束,并获取返回值thread_join(thread, &ret);printf("return thread id : %d \n",ret);return 0;
}

在这里插入图片描述

2、创建线程并分离

#include"thread.h"
#include<stdint.h>
TINT thread_proc(void *arg)
{intptr_t num = (intptr_t)arg;printf("pass arg : %d , thread id : %d\n", (int)num,thread_self_id());//sleep200毫秒thread_sleep(200);printf("thread exit\n");return 0;
}int main()
{//线程句柄Thread thread;int ret;//创建线程thread_create(&thread, thread_proc, (void *)1);//分离线程thread_detach(thread);printf("detach thread \n");thread_sleep(1000);printf("program exit\n");return 0;
}

在这里插入图片描述


总结

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

http://www.dtcms.com/wzjs/5363.html

相关文章:

  • 在线直播教学网站是怎么做的石家庄最新消息
  • 谢馥春网站建设的优势乌鲁木齐seo
  • 国内企业手机网站建设重庆官网seo分析
  • 北京app建设 网站开发公司seo服务外包
  • 三木做网站怎样优化网络
  • wordpress负载均衡上传附件抖音关键词优化
  • 青岛网站优化联系方式网络营销专业培训学校
  • 母婴微网站设计规划360优化大师官方免费下载
  • 精品网络小说推荐seo整站优化技术培训
  • 如何做网站赚流量钱谷歌三件套
  • 长沙网站制作公司怎么做哪家网络公司比较好
  • 做网站用什么字体深圳华强北
  • wordpress图片上文字宁波企业seo外包
  • 网站支持ipv6做哪些改造做个网页需要多少钱?
  • 网站建设中建站广告html单页面网络营销策略的演变
  • 成都快型网络公司排名搜索引擎优化的流程
  • 企业网站建设案例有哪些公司郑州seo排名工具
  • 网站建设 长沙在线排名优化
  • 网站开发好不好免费二级域名生成网站
  • 欧阳网站建设微商刚起步怎么找客源
  • 无锡优化网站费用免费网上销售平台
  • 微网站自助建站后台外贸平台有哪些比较好
  • 网站建设如何空间绑定域名网络推广营销技巧
  • 做网站开发的提成多少钱广点通广告投放平台登录
  • 网站建设中网页模板百度数据开放平台
  • 自媒体营销的方式有哪些seoheuni
  • 网站建设7个主要流程图seo知名公司
  • 工厂 电商网站建设seo中国是什么
  • 微信辅助网站制作网站推广优化是什么意思
  • 常熟网站开发如何点击优化神马关键词排名