我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C/C++ 原生API实现线程池的方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C/C++ 原生API实现线程池的方法是什么

本篇内容主要讲解“C/C++ 原生API实现线程池的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C/C++ 原生API实现线程池的方法是什么”吧!

线程池有两个核心的概念,一个是任务队列,一个是工作线程队列。任务队列负责存放主线程需要处理的任务,工作线程队列其实是一个死循环,负责从任务队列中取出和运行任务,可以看成是一个生产者和多个消费l者的模型。在一些高并发的网络应用中,线程池也是常用的技术。陈硕大神推荐的C++多线程服务端编程模式为:one loop per thread + thread pool,通常会有单独的线程负责接受来自客户端的请求,对请求稍作解析后将数据处理的任务提交到专门的计算线程池。

ThreadPool 线程池同步事件: 线程池内的线程函数同样支持互斥锁,信号控制,内核事件控制,临界区控制.

#include <Windows.h>#include <iostream>#include <stdlib.h>unsigned long g_count = 0;// --------------------------------------------------------------// 线程池同步-互斥量同步void NTAPI TaskHandlerMutex(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work){// 锁定资源WaitForSingleObject(*(HANDLE *)Context, INFINITE);for (int x = 0; x < 100; x++){printf("线程ID: %d ---> 子线程: %d \n", GetCurrentThreadId(), x);g_count = g_count + 1;}// 解锁资源ReleaseMutexWhenCallbackReturns(Instance, *(HANDLE*)Context);}void TestMutex(){// 创建互斥量HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);PTP_WORK pool = CreateThreadpoolWork((PTP_WORK_CALLBACK)TaskHandlerMutex, &hMutex, NULL);for (int i = 0; i < 1000; i++){SubmitThreadpoolWork(pool);}WaitForThreadpoolWorkCallbacks(pool, FALSE);CloseThreadpoolWork(pool);CloseHandle(hMutex);printf("相加后 ---> %d \n", g_count);}// --------------------------------------------------------------// 线程池同步-事件内核对象void NTAPI TaskHandlerKern(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work){// 锁定资源WaitForSingleObject(*(HANDLE *)Context, INFINITE);for (int x = 0; x < 100; x++){printf("线程ID: %d ---> 子线程: %d \n", GetCurrentThreadId(), x);g_count = g_count + 1;}// 解锁资源SetEventWhenCallbackReturns(Instance, *(HANDLE*)Context);}void TestKern(){HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);SetEvent(hEvent);PTP_WORK pwk = CreateThreadpoolWork((PTP_WORK_CALLBACK)TaskHandlerKern, &hEvent, NULL);for (int i = 0; i < 1000; i++){SubmitThreadpoolWork(pwk);}WaitForThreadpoolWorkCallbacks(pwk, FALSE);CloseThreadpoolWork(pwk);printf("相加后 ---> %d \n", g_count);}// --------------------------------------------------------------// 线程池同步-信号量同步void NTAPI TaskHandlerSemaphore(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work){// 锁定资源WaitForSingleObject(*(HANDLE *)Context, INFINITE);for (int x = 0; x < 100; x++){printf("线程ID: %d ---> 子线程: %d \n", GetCurrentThreadId(), x);g_count = g_count + 1;}// 解锁资源ReleaseSemaphoreWhenCallbackReturns(Instance, *(HANDLE*)Context, 1);}void TestSemaphore(){// 创建信号量为100HANDLE hSemaphore = CreateSemaphore(NULL, 0, 100, NULL);ReleaseSemaphore(hSemaphore, 10, NULL);PTP_WORK pwk = CreateThreadpoolWork((PTP_WORK_CALLBACK)TaskHandlerSemaphore, &hSemaphore, NULL);for (int i = 0; i < 1000; i++){SubmitThreadpoolWork(pwk);}WaitForThreadpoolWorkCallbacks(pwk, FALSE);CloseThreadpoolWork(pwk);CloseHandle(hSemaphore);printf("相加后 ---> %d \n", g_count);}// --------------------------------------------------------------// 线程池同步-临界区void NTAPI TaskHandlerLeave(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work){// 锁定资源EnterCriticalSection((CRITICAL_SECTION*)Context);for (int x = 0; x < 100; x++){printf("线程ID: %d ---> 子线程: %d \n", GetCurrentThreadId(), x);g_count = g_count + 1;}// 解锁资源LeaveCriticalSectionWhenCallbackReturns(Instance, (CRITICAL_SECTION*)Context);}void TestLeave(){CRITICAL_SECTION cs;InitializeCriticalSection(&cs);PTP_WORK pwk = CreateThreadpoolWork((PTP_WORK_CALLBACK)TaskHandlerLeave, &cs, NULL);for (int i = 0; i < 1000; i++){SubmitThreadpoolWork(pwk);}WaitForThreadpoolWorkCallbacks(pwk, FALSE);DeleteCriticalSection(&cs);CloseThreadpoolWork(pwk);printf("相加后 ---> %d \n", g_count);}int main(int argc,char *argv){//TestMutex();//TestKern();//TestSemaphore();TestLeave();system("pause");return 0;}

简单的IO读写:

#include <Windows.h>#include <iostream>#include <stdlib.h>// 简单的异步文本读写int ReadWriteIO(){char enContent[] = "hello lyshark";char deContent[255] = { 0 };// 异步写文件HANDLE hFileWrite = CreateFile(L"d://test.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, NULL);if (INVALID_HANDLE_VALUE == hFileWrite){return 0;}WriteFile(hFileWrite, enContent, strlen(enContent), NULL, NULL);FlushFileBuffers(hFileWrite);CancelSynchronousIo(hFileWrite);CloseHandle(hFileWrite);// 异步读文件HANDLE hFileRead = CreateFile(L"d://test.txt", GENERIC_READ, 0, NULL, OPEN_ALWAYS, NULL, NULL);if (INVALID_HANDLE_VALUE == hFileRead){return 0;}ReadFile(hFileRead, deContent, 255, NULL, NULL);CloseHandle(hFileRead);std::cout << "读出内容: " << deContent << std::endl;return 1;}// 通过IO获取文件大小int GetFileSize(){HANDLE hFile = CreateFile(L"d://test.txt", 0, 0, NULL, OPEN_EXISTING, NULL, NULL);if (INVALID_HANDLE_VALUE == hFile){return 0;}ULARGE_INTEGER ulFileSize;ulFileSize.LowPart = GetFileSize(hFile, &ulFileSize.HighPart);LARGE_INTEGER lFileSize;BOOL ret = GetFileSizeEx(hFile, &lFileSize);std::cout << "文件大小A: " << ulFileSize.QuadPart << " bytes" << std::endl;std::cout << "文件大小B: " << lFileSize.QuadPart << " bytes" << std::endl;CloseHandle(hFile);return 1;}// 通过IO设置文件指针和文件尾int SetFilePointer(){char deContent[255] = { 0 };DWORD readCount = 0;HANDLE hFile = CreateFile(L"d://test.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, NULL, NULL);if (INVALID_HANDLE_VALUE == hFile){return 0;}LARGE_INTEGER liMove;// 设置移动位置liMove.QuadPart = 2;SetFilePointerEx(hFile, liMove, NULL, FILE_BEGIN);// 移动到文件末尾SetEndOfFile(hFile);ReadFile(hFile, deContent, 255, &readCount, NULL);std::cout << "移动指针后读取: " << deContent << " 读入长度: " << readCount << std::endl;CloseHandle(hFile);// 设置编码格式_wsetlocale(LC_ALL, L"chs");setlocale(LC_ALL, "chs");wprintf(L"%s", deContent);}int main(int argc,char *argv){// 读写IOReadWriteIO();// 取文件长度GetFileSize();// 设置文件指针SetFilePointer();return 0;}

到此,相信大家对“C/C++ 原生API实现线程池的方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C/C++ 原生API实现线程池的方法是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C/C++ 原生API实现线程池的方法是什么

本篇内容主要讲解“C/C++ 原生API实现线程池的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C/C++ 原生API实现线程池的方法是什么”吧!线程池有两个核心的概念,一个是任务队
2023-06-25

c++线程池实现的方法是什么

C++线程池的实现方法可以使用C++中的多线程库,如std::thread和std::mutex等来实现。以下是一个简单的C++线程池的实现方法:创建一个任务队列,用于存储需要执行的任务。创建一个固定数量的线程池,每个线程都在循环中从任务
2023-10-26

C++中线程的原理与实现方法是什么

这篇文章主要介绍“C++中线程的原理与实现方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中线程的原理与实现方法是什么”文章能帮助大家解决问题。在C++中有多种实现线程的方式C++11
2023-07-05

C++中内存池的原理及实现方法是什么

这篇文章主要讲解了“C++中内存池的原理及实现方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中内存池的原理及实现方法是什么”吧!为什么要用内存池C++程序默认的内存管理(ne
2023-07-05

java线程池实现的方法是什么

Java中线程池的实现方法是通过使用java.util.concurrent包中的ThreadPoolExecutor类来创建和管理线程池。具体步骤如下:1. 使用Executors类的静态方法创建一个线程池对象,可以选择使用的线程池类型(
2023-10-11

Java线程池实现原理是什么

这篇文章主要讲解了“Java线程池实现原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java线程池实现原理是什么”吧!一、线程池参数1、corePoolSize(必填):核心线程数
2023-06-28

Java中实现线程池的原理是什么

Java中实现线程池的原理是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。01.***制线程的缺点多线程的软件设计方法确实可以***限度地发挥多核处理器的计算能力,提高生产
2023-06-16

Java中线程池的实现原理是什么

这篇文章给大家介绍Java中线程池的实现原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。线程池是什么?我们可以利用java很容易创建一个新线程,同时操作系统创建一个线程也是一笔不小的开销。所以基于线程的复用,就
2023-05-31

java线程池产生死锁的原因是什么

本篇文章为大家展示了java线程池产生死锁的原因是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向
2023-06-14

C++怎么实现一个简单的线程池

本文小编为大家详细介绍“C++怎么实现一个简单的线程池”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现一个简单的线程池”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、设计线程池应该包括保存线程的容
2023-06-30

c++创建多线程的方法是什么

在C++中,有多种方法可以创建多线程。以下是其中几种常见的方法:使用std::thread类:std::thread类是C++标准库中用于创建和管理线程的类。通过创建std::thread对象并传入要执行的函数、函数参数等信息来创建线程。#
2023-10-25

Go实现线程池的两种方式是什么

这篇“Go实现线程池的两种方式是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go实现线程池的两种方式是什么”文章吧。w
2023-06-30

Java线程池实现原理是什么及怎么使用

这篇文章主要讲解了“Java线程池实现原理是什么及怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java线程池实现原理是什么及怎么使用”吧!1. 为什么要使用线程池使用线程池通常由以
2023-07-04

quartz线程池配置的方法是什么

要配置Quartz线程池,可以使用以下方法:1. 在Quartz配置文件中配置线程池属性:可以在quartz.properties文件中配置线程池的属性。例如,可以设置线程池的名称、线程数、线程优先级等。以下是一个示例配置:```org.q
2023-09-18

spring配置线程池的方法是什么

在Spring中配置线程池的方法有两种:使用XML配置文件:首先,在Spring的XML配置文件中添加一个元素,指定线程池的一些属性,例如核心线程数、最大线程数、队列容量等。然后,使用元素来启用基于注解的异步方法和任务调度功能。示例配置如
2023-10-25

tomcat线程池调优的方法是什么

Tomcat线程池调优的方法包括以下几个方面:调整线程池大小:根据系统负载和并发请求量来调整线程池大小,确保线程池能够满足系统的需求,但同时也要避免线程池过大导致资源浪费。调整线程池的参数:包括核心线程数、最大线程数、队列大小等参数,根据系
tomcat线程池调优的方法是什么
2024-03-12

springboot集成线程池的方法是什么

在Spring Boot中集成线程池可以通过以下方法进行:添加依赖:在pom.xml文件中添加以下依赖:org.springframework.bootspring-boot-starter-web配置线程池:在application.pr
2023-10-21

Java线程池优化的方法是什么

这篇文章主要介绍“Java线程池优化的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java线程池优化的方法是什么”文章能帮助大家解决问题。升级版线程池的优化1:新增了4种拒绝策略。分别为
2023-06-29

java线程池创建的方法是什么

在Java中,线程池可以使用以下两种方法来创建:使用`Executors`类中的静态方法来创建线程池:ExecutorService executor = Executors.newFixedThreadPool(10);上面的代码将创
2023-10-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录