文章关键字:|ACL库|线程池|JAVA|.NET| 框架|并发|
一、概述
在当今强调多核开发的年代,要求程序员能够写出高并发的程序,而利用多个核一般有两种方式:采用多线程方式或多进程方式。每处理一个新任务时如果临时产生一个线程或进程且处理完任务后线程或进程便立即退出,显示这种方式是非常低效的,于是人们一般采用线程池的模型(这在JAVA或 .NET 中非常普遍)或多进程进程池模型(这一般在UNIX平台应用较多)。此外,对于线程池或进程池模型又分为两种情形:常驻留内存或半驻留内存,常驻内存是指预先产生一批线程或进程,等待新任务到达,这些线程或进程即使在空闲状态也会常驻内存;半驻留内存是指当来新任务时如果线程池或进程池没有可利用线程或进程则启动新的线程或进程来处理新任务,处理完后,线程或进程并不立即退出,而是空闲指定时间,如果在空闲阀值时间到达前有新任务到达则立即处理新任务,如果到达空闲超时后依然没有新任务到达,则这些空闲的线程或进程便退出,以让出系统资源。所以,对比常驻内存方式和半驻留内存方式,不难看出半驻留方式更有按需分配的意味。
下面仅以ACL框架中的半驻留线程池模型为例介绍了如何写一个半驻留线程池的程序。
二、半驻留线程池例子
2.1)程序代码
#include "lib_acl.h"
#include <assert.h>
/**
* 用户自定义数据结构
*/
typedef struct THREAD_CTX {
int i;
} THREAD_CTX;
/* 全局性静态变量 */
static ACL_WORK_QUEUE *__wq = NULL;
/* 线程局部存储变量(C99支持此种方式声明,方便许多) */
static __thread unsigned int __local = 0;
static void workq_thread_fn(int event acl_unused, void *arg)
{
ACL_WORKER_ATTR *worker_attr = (ACL_WORKER_ATTR*) arg; /* 获得当前工作线程的属性变量 */
THREAD_CTX *ctx = (THREAD_CTX*) worker_attr->run_data; /* 获得用户自定义对象 */
int i = 5;
while (i-- > 0) {
printf("thread start! tid=%d, i=%d, __local=%d\r\n",
acl_pthread_self(), ctx->i, __local);
/* 在本线程中将线程局部变量加1 */
__local++;
sleep(1);
}
acl_myfree(ctx);
/* 至此,该工作线程进入空闲状态,直到空闲超时退出 */
}
static int __on_thread_init(void *arg, ACL_WORKER_ATTR *attr)
{
const char *myname = "__on_thread_init";
ACL_WORK_QUEUE *wq = (ACL_WORK_QUEUE*) arg;
/* 判断一下,仅是为了验证参数传递过程 */
assert(wq == __wq);
printf("%s: thread(%d) init now\r\n", myname, acl_pthread_self());
/* 返回0表示继续执行该线程获得的新任务,返回-1表示停止执行该任务 */
return (0);
}
static void __on_thread_exit(void *arg, ACL_WORKER_ATTR *attr)
{
const char *myname = "__on_thread_exit";
ACL_WORK_QUEUE *wq = (ACL_WORK_QUEUE*) arg;
/* 判断一下,仅是为了验证参数传递过程 */
assert(wq == __wq);
printf("%s: thread(%d) exit now\r\n", myname, acl_pthread_self());
}
static void run_thread_pool(ACL_WORK_QUEUE *wq)
{
THREAD_CTX *ctx; /* 用户自定义参数 */
/* 设置全局静态变量 */
__wq = wq;
/* 设置线程开始时的回调函数 */
(void) acl_workq_atinit(wq, __on_thread_init, wq);
/* 设置线程退出时的回调函数 */
(void) acl_workq_atfree(wq, __on_thread_exit, wq);
ctx = (THREAD_CTX*) acl_mycalloc(1, sizeof(THREAD_CTX));
assert(ctx);
ctx->i = 0;
/**
* 向线程池中添加第一个任务,即启动第一个工作线程
* @param wq 线程池句柄
* @param workq_thread_fn 工作线程的回调函数
* @param event_type 此处写0即可
* @param ctx 用户定义参数
*/
acl_workq_add(wq, workq_thread_fn, 0, ctx);
sleep(1);
ctx = (THREAD_CTX*) acl_mycalloc(1, sizeof(THREAD_CTX));
assert(ctx);
ctx->i = 1;
/* 向线程池中添加第二个任务,即启动第二个工作线程 */
acl_workq_add(wq, workq_thread_fn, 0, ctx);
}
int main(int argc acl_unused, char *argv[] acl_unused)
{
ACL_WORK_QUEUE *wq;
int max_threads = 20; /* 最多并发20个线程 */
int idle_timeout = 10; /* 每个工作线程当空闲10秒后自动退出 */
/* 创建半驻留线程句柄 */
wq = acl_workq_create(max_threads, idle_timeout, NULL, NULL);
assert(wq);
run_thread_pool(wq);
/* 主线程等待用户在终端输入任意字符后退出 */
getchar();
/* 销毁线程池对象 */
acl_workq_destroy(wq);
return (0);
}
2.2)编译链接
从 http://www.sourceforge.net/projects/acl/ 站点下载 acl_project 代码,在WIN32平台下请用VC2003编译,打开 acl_project\win32_build\vc\acl_project_vc2003.sln 编译后在目录 acl_project\dist\lib_acl\lib\win32 下生成lib_acl_vc2003.lib, 然后在示例的控制台工程中包含该库,并包含acl_project\lib_acl\include 下的 lib_acl.h 头文件,编译上述源代码即可。
另外,还可以查看ACL的在线帮助文档:http://acl.sourceforge.net/acl_help/index.html
2.3) 运行
运行示例程序后,在我的机器的显示结果如下:
__on_thread_init: thread(14016) init now
thread start! tid=14016, i=0, __local=0
thread start! tid=14016, i=0, __local=1
__on_thread_init: thread(8792) init now
thread start! tid=8792, i=1, __local=0
thread start! tid=14016, i=0, __local=2
thread start! tid=8792, i=1, __local=1
thread start! tid=8792, i=1, __local=2
thread start! tid=14016, i=0, __local=3
thread start! tid=14016, i=0, __local=4
thread start! tid=8792, i=1, __local=3
thread start! tid=8792, i=1, __local=4
__on_thread_exit: thread(14016) exit now
__on_thread_exit: thread(8792) exit now
原文地址:http://www.evget.com/zh-CN/Info/ReadInfo.aspx?id=9177
分享到:
相关推荐
内存驻留程序是一种特殊类型的计算机程序,它在操作系统启动后加载到内存中,并持续存在,直到系统关闭。这种程序的设计目的是为了提供实时的服务或者在后台执行特定任务,而不需要用户频繁地启动或关闭它们。本项目...
中断驻留程序是一种在计算机操作系统中执行特定任务的软件组件,尤其在图形用户界面中,它允许用户与系统进行交互,比如移动窗口中的图形对象。本文将深入探讨中断驻留程序的工作原理、实现机制以及其在图形处理中的...
标题 "TC 开发内存驻留程序" 指的是在Turbo C (TC) 编程环境下开发一种特殊类型的程序,这种程序能够在计算机内存中常驻,即使在用户关闭程序后,它仍然保留在内存中,等待后续调用或者执行特定任务。这种技术常见于...
内存驻留程序,通常指的是那些在计算机启动后常驻内存,持续运行并提供特定功能的程序。这些程序在操作系统启动时加载,以便快速响应用户的请求,或者为了保持系统的某些核心服务持续可用。在Windows系统中,这类...
标题中的“TSR 驻留程序开发 C 语言源码”指的是在计算机编程领域,使用C语言编写的一种特殊类型的程序,称为TSR(Terminate and Stay Resident)驻留程序。这种程序在执行后不会完全退出,而是留在内存中,等待用户...
VC 实现的系统驻留程序,源代码下载,自写了部分系统API躲避主动式杀毒软件,不过某些杀软比如360仍然会报警,不放心的就不要下载了。一个系统驻留程序的源代码。请勿用作非法用途,仅供学习。造成的一些后果与作者...
在C语言课程设计中,实现一个时钟驻留程序是一项具有挑战性的任务,它涉及到操作系统原理、进程管理和时间管理等多个方面的知识。时钟驻留程序通常是指一个能在后台持续运行,每隔一定时间执行特定任务(如显示当前...
编译并生成beep.exe,将其拷贝至c:\目录下,供安装程序调用。当安装完毕后,SCM也将调用beep.exe来执行该服务。 2) install工程用于新服务的安装,工程中包含install.cpp。编译并生成install.exe,将其拷贝至:c:\...
在早期的个人计算机系统中,DOS(磁盘操作系统)占据着主导地位,而汇编语言作为底层编程的工具,是开发内存驻留程序的主要手段。内存驻留程序是指在计算机启动后,常驻内存,随时可以响应系统或用户请求的程序。...
### 汇编语言下DOS内存驻留程序设计概览 #### 1. 内存驻留程序(TSR)概念解析 内存驻留程序,全称“Terminate and Stay Resident Program”(TSR),是一种在计算机系统中加载至内存、执行完毕后并不释放其占用的内存...
在本文中,我们将深入探讨如何使用C#编程语言来开发一个模拟QQ窗体停靠和驻留系统托盘的程序。这个程序的核心功能是提供一个类似QQ应用的用户体验,允许用户将窗口停靠在屏幕边缘,并在最小化时将程序图标隐藏到系统...
TSR(Terminate and Stay Resident)驻留程序是20世纪80年代至90年代早期在DOS操作系统中广泛使用的一种技术。这种程序能够在退出后仍然保留在内存中,以便在需要时快速调用,而无需再次加载到内存。TSR程序在DOS...
在"MFC内存驻留的实现"这个项目中,开发者利用MFC库来设计了一个内存驻留的程序。这样的程序可能有多种用途,比如监控系统状态、定时执行任务或者提供后台服务。然而,描述中提到的“木马功能”引起了注意。木马是一...
关键的操作区域分为两部分:右侧是用户添加需要驻留时间的程序的地方,左侧则是显示已经添加并设置好驻留日期的程序列表。用户可以点击右侧的按钮,选择想要驻留时间的程序,比如一个需要长时间运行的游戏或应用,...
3. TSR程序设计:如何编写驻留部分,设置中断处理程序,以及如何在程序中嵌入驻留机制。 4. 实例解析:提供多个实际的TSR程序示例,帮助读者理解并动手实践。 5. 错误处理和调试技巧:如何应对TSR程序可能出现的问题...
利用INT 1CH(大约每秒中断18.2次)编写一个中断驻留程序,要求在屏幕的右上角显示计算机中当前系统时间,显示格式为:时:分:秒.
### 微信小程序开发概述 #### 一、微信小程序简介 **1.1 小程序介绍** 微信小程序,作为移动互联网时代的创新产物,是腾讯公司为解决应用过度占用手机存储空间而推出的一种全新的轻量级应用程序形态。它具有无需...
时光驻留器是一款让软件获取固定时间的软件,该软件可以对软件下所有程序做时光驻留,操作简单,效果极佳,可以免费驻留一个软件,让您体验时光魔法师的神奇魅力。 前面都是废话,很多软件都可以使用这个工具来达到...
在C语言中,可以用keep ( )函数将程序驻留内存。这个函数有两个参数:status和size。size为驻留内存长度,可以用size=_SS+_SP/16-_psp得到,当然这也是一种估算的方法,并不是精确值。函数执行完以后,出口状态信息...
内存驻留技术是一种在计算机操作系统中管理程序的方式,使得程序可以在需要时被快速激活,而无需反复加载到内存。在早期的个人计算机系统中,这种技术尤其重要,因为当时的内存资源相对有限。以下是对给定文件中可能...