WIndows编程之线程池的使用

不得不说,做C++服务器程序开发,要是不理解线程池,不懂线程池,做C++服务器端的程序就没有任何意义。特别就是上次我因为理解错了线程池而做错了一件事,而被指导人批了一顿,至今记忆犹新,所以趁着周末学了下线程池的使用,小有成绩。

先看一种比较简单的线程池的实现。

 1 #include <windows.h>
 2 #include <string>
 3 #include <iostream>
 4
 5 using namespace std;
 6
 7 #define BEGINTHREAD(Fun,Param)  CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Fun,Param,0,NULL);
 8
 9 DWORD WINAPI ThreadProc(LPVOID lpParameter);
10
11 int main()
12 {
13
14     string words[10] = { "I am a gay.....", "I am a gay, too", "Let us do something exceting", "ah, Do you want to do it in the forest or in the bed?", "neither, I want to do it on the street. haha",
15                         "I heard you like music.", "Yeah, Just like the light music.", "For example...", "bosty music and so on", "ah, you mean that is the light music...." };
16
17     for (int i = 0; i < 10; i++)
18     {
19         //下面的代码演示了,使用CreateThread和QueueUserWorkItem,实际效果
20         //是一样的,当然线程不多的情况下如此,如果线程很多时一定要使用QueueUserWorkItem
21         QueueUserWorkItem(ThreadProc, (PVOID)&words, WT_EXECUTELONGFUNCTION);
22
23         //显示使用CreateThread来创建多个线程的效果
24         //BEGINTHREAD(ThreadProc, (LPVOID)&words[i]);
25     }
26
27     while (true);
28
29     return 0;
30 }
31
32 //该函数可以由CreateThread的线程启动,也可以使用QueueUserWorkItem线程池中的线程启动
33 DWORD WINAPI ThreadProc(LPVOID lpParameter) {
34     while (true)
35     {
36         std::string word = *(std::string*)lpParameter;
37         std::cout << "线程[ID:" << GetCurrentThreadId() << "]说:" << word << std::endl;
38         Sleep(5 * 1000);
39     }
40     return 0;
41 }

这里我们没有使用到任何线程池的信息,就可以直接使用线程池了,因为我们使用的方法里头默认给我们创建了一个线程池,但是在实际服务器的开发中,我们必须设置线程池的大小,必须自定义线程池的属性,就必须设置线程池的信息,这时就需要我们手动调用来创建线程池。

运行截图:

从这张图片里面也可以看出线程池里面执行的情况与我们自定义多线程还是有很大区别的,多线程里面的输出语句是不会被打断的,但是再看看我们的程序,连输出语句也被打断了。(具体多线程里面的输出语句为什么没有被打断,目前我也不清楚,按理是应该被打断的)

未完,待续。。。。

时间: 2024-12-23 13:37:16

WIndows编程之线程池的使用的相关文章

【转】Java并发编程:线程池的使用

Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这样的效果.今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPool

Android多线程编程之线程池学习篇(一)

Android多线程编程之线程池学习篇(一) 一.前言 Android应用开发中多线程编程应用比较广泛,而应用比较多的是ThreadPoolExecutor,AsyncTask,IntentService,HandlerThread,AsyncTaskLoader等,为了更详细的分析每一种实现方式,将单独成篇分析.后续篇章中可能涉及到线程池的知识,特此本篇分析为何使用线程池,如何使用线程池以及线程池的使用原理. 二.Thread Pool基础 进程代表一个运行中的程序,一个运行中的Android

Java并发编程:线程池的使用(转)

Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这样的效果.今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPool

并发编程 13—— 线程池 之 整体架构

Java并发编程实践 目录 并发编程 01—— ConcurrentHashMap 并发编程 02—— 阻塞队列和生产者-消费者模式 并发编程 03—— 闭锁CountDownLatch 与 栅栏CyclicBarrier 并发编程 04—— Callable和Future 并发编程 05—— CompletionService : Executor 和 BlockingQueue 并发编程 06—— 任务取消 并发编程 07—— 任务取消 之 中断 并发编程 08—— 任务取消 之 停止基于线

并发编程 15—— 线程池 之 原理二

Java并发编程实践 目录 并发编程 01—— ConcurrentHashMap 并发编程 02—— 阻塞队列和生产者-消费者模式 并发编程 03—— 闭锁CountDownLatch 与 栅栏CyclicBarrier 并发编程 04—— Callable和Future 并发编程 05—— CompletionService : Executor 和 BlockingQueue 并发编程 06—— 任务取消 并发编程 07—— 任务取消 之 中断 并发编程 08—— 任务取消 之 停止基于线

并发编程 14—— 线程池 之 原理一

Java并发编程实践 目录 并发编程 01—— ConcurrentHashMap 并发编程 02—— 阻塞队列和生产者-消费者模式 并发编程 03—— 闭锁CountDownLatch 与 栅栏CyclicBarrier 并发编程 04—— Callable和Future 并发编程 05—— CompletionService : Executor 和 BlockingQueue 并发编程 06—— 任务取消 并发编程 07—— 任务取消 之 中断 并发编程 08—— 任务取消 之 停止基于线

Java 并发编程之线程池的使用 (二)

设置线程池的大小 如果线程池过大,那么可能会耗尽资源 ,如果过小,那么 将导致许多空闲的处理器无法工作,从而降低吞吐率. 要设置正确的线程池大小,需要分析计算环境,资源预算和任务的特性,cpu数量,内存大小,任务是计算密集型还是I/O密集型,还是二者皆可.它们是否需要像JDBC连接这样的稀缺资源,下面给出一个计算公式 N(threads)=N(cpu)*U(cpu)*(1+w/c); N(threads)是最后得到的结果大小 . N(cpu)是cpu数量,我的电脑是双核四线程,cpu的数量会是4

Python并发编程之线程池/进程池--concurrent.futures模块

h2 { color: #fff; background-color: #f7af0d; padding: 3px; margin: 10px 0px } 一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我们就要编写自己的线程池/进程池,以空间换时间.但从Python3.2开始,标准库为我们提供了conc

windows下利用线程池完成多任务的分配和运行

在做项目的过程中有时候为了提升效率,用了多线程的方法来对任务进行分割和应用,后来发现,采用线程池的方法能更好的利用线程资源来计算任务,网上有很多关于如何运行线程池的例子,msdn上也给出了对应的例子:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686980(v=vs.85).aspx 感兴趣的话大家可以去看看,这里我给出一个简单的demo,利用线程池单次调用多次调用,例子如下: [cpp] view plain copy