c语言线程池
Ⅰ 对于c语言来说 线程池的作用是什么
为什么达不到?线程和什么语言无关,这是操作系统的概念,或者说是第三方库提供的概念。
Ⅱ linux下 c 语言线程池怎么调用
1 使用线程池的原因
通常使用多线程都是在需要的时候创建一个新的线程,然后执行任务,完成后退出。一般情况下是完全够满足我们的程序的。
但是当我们需要创建大量的线程,并且执行一个简单的任务之后销毁,比如:在web,email,db里面的一些应用,如彩铃,或者网络通信编程,或者云计算里面后台镜像处理的时候,我们的应用在任何时候都要准备面对数目巨大的连接请求,同时,这些请求执行的任务却又比较简单,占用的时间很少,这样我们可能就会处于不停的创建线程并销毁线程的状态。虽说比起进程的创建,线程的创建时间已经大大缩短,但是如果需要频繁的创建线程,并且每个线程所占用的处理时间又非常简短,则线程创建和销毁带给处理器的额外负担也是很可观的。
线程池的作用正是在这种情况下有效的降低频繁创建销毁线程所带来的额外开销。一般来说,线程池都是采用预创建的技术,在应用启动之初便预先创建一定数目的线程。应用在运行的过程中,需要时可以从这些线程所组成的线程池里申请分配一个空闲的线程,来执行一定的任务,任务完成后,并不是将线程销毁,而是将它返还给线程池,由线程池自行管理。如果线程池中预先分配的线程已经全部分配完毕,但此时又有新的任务请求,则线程池会动态的创建新的线程去适应这个请求。当然,有可能,某些时段应用并不需要执行很多的任务,导致了线程池中的线程大多处于空闲的状态,为了节省系统资源,线程池就需要动态的销毁其中的一部分空闲线程。因此,线程池都需要一个管理者,按照一定的要求去动态的维护其中线程的数目。
当然,如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了。
Ⅲ 帮忙看看windows下C语言编写线程池
如果创建只用一个线程,那只能一个个取了执行。
想并行,只能用一个线程来取地址,然后发送到各个多个已有线程,再由这些线程来完成创建工作。
至于线程池,参考网上的,这个没什么特别的。
Ⅳ C语言如何使用线程池中的某个线程
问别人问题,还这么牛叉,真心佩服
不要给线程派任务,让线程空闲的时候,自己去领任务
Ⅳ C语言:编写函数fun返回二维数组周边元素之和,咋写
入门到放弃?
“C/C++真的太难学了,我准备放弃了!”
很多初学者在学完C和C++的基本语法后,就停滞不前了,最终走向“从入门到放弃”。其实,我们初学者最需要的不是HelloWorld,也不是语法知识的堆砌,需要的只是实战项目的磨砺。
一个项目一座城
一个项目,一座城。写完一个项目,攻克一座城池。
以下十三个循序渐进的项目,让你从小白,快速晋升为大牛。
奇牛项目1《黑客攻击系统》-第一城
从完全零基础开始,手把手开发这款黑客攻击系统。
通过用户端的输入, 向服务器端木马发送攻击命令,实现多种方式的攻击效果。
通过这个项目,可以掌握C/C++基础(数据类型,变量的使用,各种运算,控制语句,命名空间,输入输出,函数调用,库文件的使用等),直接使用图形库来实现窗口用户界面,直接使用库文件来实现攻击效果。
奇牛项目2 《人工智能地形导航系统》-第二城
具备C/C++基础后,进一步学习二维数组、多维数组在工程项目中的应用。
根据地图的海拔数据,来识别地形上的各个峰点(最高点)和谷点(最低点),以确定地形中峰点的数目和位置,为探测器提供导航数据。
通过这个项目,可以深刻掌握二维数组、多维数组的本质,以及在工程项目中的应用方法。
奇牛项目3《人工智能双色球预测系统》-第三城
根据笔者Rock的闲暇之作改写,体会以小博大的乐趣。
通过自动分析博彩官网的海量数据,根据自定义的统计预测规则,来捕捉下期开奖的最大概率。
通过这个项目,掌握指针的使用,以及指针在工程项目中的应用。
奇牛项目4《地震监测系统》-第四城
地震检波器每隔固定的时间间隔,采样一次预测地震的能量数据,并保存到文件中。地震监测系统从这个文件中读取相应的能量数据,测试在给定的时间点上,一个短时间窗口内的取样值与一个长时间窗口内取样值的商,如果这个比例高于给定的阈值,那么在这个事件点上极有可能发生地震。
通过这个项目,掌握C/C++文件的读写、以及动态内存管理的使用,以及它们在工程项目中的应用。
奇牛项目5《智能婚恋交友系统》-第五城
程序员的相亲活动,低调且奢华。这个项目直接致敬某XX佳缘婚恋交友平台,毕竟Rock也曾经是该平台的注册会员,并在其中活跃良久。
这个项目实现了该平台的核心功能-高匹配度自动交友。
通过这个项目,掌握C++的面向对象思想、继承和派生、多态、友元、运算符重载等核心机制,以及它们在工程中的应用。
奇牛项目6《广州军区微波通信系统》-第六城
这个项目是根据笔者Rock负责研发的广州军区南海无线微波通信系统改写的, 已去除敏感数据。
这个项目是在菲律宾、越南肆意骚扰我国南海岛屿的背景下研发的。通过这个项目,掌握C++核心机制-多态的使用,以及在军事工程项目中的应用。
奇牛项目7《模板库高级编程-万能择优器》-第七城
在掌握了C、C++的核心特性之后,能否掌握C++标准模板库STL, 是区分一名合格C++程序员的重要标志。
这个项目通过构建一个通用的择优器,来掌握C++泛型编程的使用,以及在自定义模块开发中的应用。
奇牛项目8《游戏服务器端数据库》-第八城
在征服了C/C++语言的核心特性之后,很多人会感到新的迷茫:C/C++语言到底能做什么?海量用户数据怎么处理?
这个项目从零开始构建大型游戏数据库,以掌握数据库开发的方法,以及在产品级项目中的应用。
奇牛项目9 《企业QQ》-第九城
很多C/C++初学者,认为C和C++虽然很强大,但是对于用户界面开发,就不是很方便了。
其实对于用户界面的开发,C和C++,尤其是C++,是非常强悍的。各种绚丽的用户界面,C++都能游刃有余地呈现。
这个项目能够深度掌握基于C++的用户界面开发,以及网络编程,实现产品级的应用效果。
奇牛项目10 《跨平台Word》-第十城
IT外包开发时,用户的需求总是千变万化,界面和功能都需要做特殊的定制,这个项目让我们掌握开发特定UI和特定功能的应用软件,为以后独立承接IT外包打下足够的基础。
奇牛项目11《 游戏外*修改器》-第十一城
外*、逆向、破解无疑是每一位程序员为之向往的“禁地”,这个项目融合逆向、汇编、DLL注入、内存篡改等黑技术,开发客户端游戏的外挂,实现对游戏数据的截取、修改。
通过这个项目,可以深刻掌握指针、逆向、DLL注入等技术的使用,以及Windows客户端应用的开发。
奇牛项目12 《人工智能中国象棋人机对弈》-第十二城
完胜李世石和柯洁的阿尔法狗,其底层框架就是使用C++实现的。
除了围棋,C++更是在象棋领域完胜人类。这个项目,就是使用C++打造的人工智能象棋。
通过这个项目,可以轻松掌握各种复杂数据结构,把个人编程能力提升到极致。
奇牛项目13 《电信级大型互联网项目-共享顺风车系统》-第十三城
掌握C、C++客户端开发之后,高性能服务器开发,成为判别C++高级程序员的重要标志。这个项目将实现电信级的大型互联网服务器。
通过奇牛编程的项目实战,可以掌握百万级高并发服务器的核心技术(线程池、epool架构、协议开发等)
敲代码的夜,清脆的键击,孤独而坚定。
弹指间,攻城略地,早已硝烟弥漫。
十三座城池,待你来征服。
经过以上13个项目的修炼,你已经从小白蜕变为能够驾驭大型项目开发的大牛了。
Ⅵ windows C语言实现线程池
户提供连接,也就是50个线程。多余的其它客户连接会被阻塞直到有空余的连接出现。其实就是所谓的“线程池”的概念,你可以搜搜这方面的内容,很多很多的。
Ⅶ C语言如何使用线程池中的某个线程
问别人问题,还这么牛叉,真心佩服
不要给线程派任务,让线程空闲的时候,自己去领任务
Ⅷ c语言线程池关于空闲线程队列的疑问
没错,没有这些队列照样可以做线程池,只是有了这些队列可以控制一下每个工作线程的负载
Ⅸ c语言epool怎么和线程池一起使用
一, 背景
先说下我要实现的功能,server端一直在linux平台下面跑,当客户端有请求过来的时候server端接受到请求,拿到客户端的数据,根据拿到的数据做出相应的处理,得到处理的结果直接把结果数据发送给客户端。这样一个连接的请求结束,我的不是长连接的情况,不会一直保持客户端的连接。来一个处理一个处理完了就结束了。
二,源码下载(包括客户端测试代码)
我把逻辑处理部分简单化了,如果这份代码对你们有用的话,可以自己实现逻辑处理部分。
代码是要传入参数的,端口
代码我已经在Linux下面编译过了,也测试号了,因为代码中用到了数据库,如果你没有编译过可能要在Linux下装Mysql数据库。
源码下载地址
三,代码的简单介绍
socket接受线程:C语言为了高并发所以选择了epoll。当程序启动的时候(g_net_update.c文件中main函数,会启动一个thread见函数create_accept_task)这个thread就处理一件事情,只管接收客户端的连接,当有连接进来的时候 通过epoll_ctl函数,把socket fd 加入到epoll里面去,epoll设置监听事件EPOLLIN | EPOLLET; 主要是监听的是加入到epoll中的socket是否可读(因为我的需求是客户端连上了server就会马上向server发送一份数据的)。其它的部分在主线程中处理。
主线程:是一个无线循环,epoll_wait 函数相当于把客户端的连接从epoll中拿出来(因为我们监听的是EPOLLIN | EPOLLET)说明这个时候客户端有数据发送过来)。再通过recv_buffer_from_fd 函数把客户端发送过来的数据读出来。然后其他的一切就抛给线程池去处理。
线程池:(代码中我会在池里面创建15个线程) 双向链表。加入线程就是在链表后面加一个链表项,链表的前面会一个一个被拿出来处理。主要是malloc 函数free函数,sem_wait函数sem_post的处理(sem_wait 会阻塞当值大于0是会减一,sem_post是值加一)。typedef void* (FUNC)(void arg, int index);是我们自定义的线程的逻辑处理部分,arg是参数,index是第几个线程处理(我们隐形的给每个线程都标了号),例如代码中的respons_stb_info,更加具体可以看看代码里面是怎么实现的。聪明的你也可以改掉这块的内容改成动态线程池,当某个时刻的处理比较多的时候能够动态的增加线程,而不像我代码里面的是固定的。
数据库连接池:按照我的需求在处理客户端请求数据的时候是要访问数据库的。就是一下子创建出一堆的数据连接。要访问数据库的时候先去数据库连接池中找出空闲的连接,具体可以看下代码。使用的时候可以参考下database_process.c文件(代码中数据库连接池和线程池中的个数是一样的)。这里我想说下get_db_connect_from_pool这个函数,我用了随机数,我是为了不想每次都从0开始去判断哪个连接没有用到。为了数据库连接池中的每个链接都能等概率的使用到,具体的还是可以看下代码的实现。
log文件,代码中是可以自动保存log信息到文件中去的,具体可以看下代码。
四,碰到的一些问题和解决办法
最初的时候server程序跑起来占掉了linux 90%多的使用率,因为是我们在create_accept_task 中socket没有设置成阻塞的。
server经常碰到一些莫名其妙的死机,没办法用了core mp 去抓死机的堆栈信息看在哪个函数死机的。
在处理数据库的时候有的数据会自动的断掉(说是说8个小时) 后来采用的办法是每次都先mysql_ping一次让他重新连接上。
就说几点吧,其实还有好多其他的就不说了。
五,在Linux下面用到的几个命令
./server程序名 & //加&后台运行。
killall server程序名 // 停掉server的运行。要在server目录下面执行
netstat -antp|grep :端口号 // 查看端口下的socket状态
ps -eaf | grep server程序名 // 检查程序是否在运行,不过我一般是netstat -antp|grep :端口号 来看程序是否在运行。
好了 就到这里吧,如果你想实现java的高并发可以稍微看下 Linux java + apache mina + maven 实现高并发服务器
顶
2
踩
Ⅹ 线程池中空闲的线程处于什么状态
一:阻塞状态,线程并没有销毁,也没有得到CPU时间片执行;
源码追踪:
for (;;) {
...
workQueue.take();
...
}
public E take()...{
...
while (count.get() == 0) { / /这里就是任务队列中的消息数量
notEmpty.await();
}
...
}
public final void await()...{
...
LockSupport.park(this);
...
}
继续往下:
public static void park(Object blocker) {
Thread t = Thread.currentThread();
setBlocker(t, blocker);
U.park(false, 0L);
setBlocker(t, null);
}
private static final sun.misc.Unsafe U = sun.misc.Unsafe.getUnsafe();
//线程调用该方法,线程将一直阻塞直到超时,或者是中断条件出现。
public native void park(boolean isAbsolute, long time);
上面就是java11线程池中阻塞的源码追踪;
二.对比object的wait()方法:
@FastNative
public final native void wait(long timeout, int nanos) throws InterruptedException;
还有Thread的sleep() 方法:
@FastNative
private static native void sleep(Object lock, long millis, int nanos)throws...;
可见,线程池中使用的阻塞方式并不是Object中的wait(),也不是Thread.sleep() ;
这3个方法最终实现都是通过c&c++实现的native方法.
三.在<<Java虚拟机(第二版)>>中,对线程状态有以下介绍:
12.4.3状态转换
Java语言定义了5种线程状态,在任意一个时间点,一个线程只能有且只有其中的一种
状态,这5种状态分别如下。
1)新建(New):创建后尚未启动的线程处于这种状态。
2)运行(Runable):Runable包括了操作系统线程状态中的Running和Ready,也就是处于此
状态的线程有可能正在执行,也有可能正在等待着CPU为它分配执行时间。
3)无限期等待(Waiting):处于这种状态的线程不会被分配CPU执行时间,它们要等待被
其他线程显式地唤醒。以下方法会让线程陷入无限期的等待状态:
●没有设置Timeout参数的Object.wait()方法。
●没有设置Timeout参数的Thread.join()方法。
●LockSupport.park()方法。
4)限期等待(Timed Waiting):处于这种状态的线程也不会被分配CPU执行时间,不过无
须等待被其他线程显式地唤醒,在一定时间之后它们会由系统自动唤醒。以下方法会让线程
进入限期等待状态:
●Thread.sleep()方法。
●设置了Timeout参数的Object.wait()方法。
●设置了Timeout参数的Thread.join()方法。
●LockSupport.parkNanos()方法。
●LockSupport.parkUntil()方法。
5)阻塞(Blocked):线程被阻塞了,“阻塞状态”与“等待状态”的区别是:“阻塞状态”在等
待着获取到一个排他锁,这个事件将在另外一个线程放弃这个锁的时候发生;而“等待状
态”则是在等待一段时间,或者唤醒动作的发生。在程序等待进入同步区域的时候,线程将
进入这种状态。
结束(Terminated):已终止线程的线程状态,线程已经结束执行。