Linux多任务编程——线程

线程基础与线程池

线程基础

  △ 由于进程的地址空间是私有的,因此在进行上下文切换时,系统开销比较大

  △ 在同一个进程中创建的线程共享该进程的地址空间

  △ 通常线程值得是共享相同地址空间的多个任务

  △ 每个线程的私有这些私有资源:线程ID、PC(程序计数器)和相关寄存器、栈{局部变量,函数返回地址}、错误号、信号掩码和优先级、执行状态和属性

  △ 线程间同步和互斥机制有:信号量、互斥锁、条件变量

 

1--- 线程相关函数

   在Linux中一般通过第三方线程库来实现: 以下主要是 New POSIX Thread Library (NPTL);

   #include <pthread.h>


   int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*routine)(void *), void *arg);      //创建一个新线程

   thread:要创建的线程        attr:指定的线程属性, NULL表示缺省属性        routine:线程中要执行的函数        argv:传递给线程执行的函数的参数

   返回键  成功:0     出错:错误号


   int pthread_join(pthread_t thread, void **value_ptr);    //等待一个线程的结束

   thread:要等待的线程;        value_ptr:指针*value_ptr指向线程返回的参数

   返回值  成功:0     出错:错误号


   void pthread_exit(void *value_ptr);     //退出线程

   value_ptr:线程退出时的返回值


   int pthread_cancel(pthread_t thread);        //给线程发送终止信号

   thread:要发送信号的进程

 

2--- 多线程编程示例

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <pthread.h>
 5 
 6 char message[32] = "Hello world";
 7 void *thread_function(void *arg);
 8 
 9 int main(int argc, char *argv[])
10 {
11     pthread_t a_thread;
12     void *thread_result;
13     
14    if (pthread_create(&a_thread, NULL, thread_function, (void *)message) < 0);            //使用缺省属性创建线程
15    {
16         perror("fail to pthread create");
17         exit(-1);
18     }
19     printf("waiting for thread to finish\n");
20     if (pthread_join(a_thread, &thread_result) < 0)            //等待线程结束
21     {
22          perror("fail to pthread join");
23          exit(-1); 
24     }
25     printf("MESSAGE is now %s\n", message);
26 
27     return 0;
28 }
29 
30 void *thread_function(void *arg)
31 {
32  
33     srtcpy(message, "marked by thread");
34     pthread_exit("Thank you for the cpu time");
35 }

 

3--- 编译多线程程序

  # gcc -o sample sample.c -lpthread -D_REENTRANT

  -lpthred:;链接pthread库

  -D_REENTRANT:生成可重入代码

  pthread_key_create(); 线程私有数据  unix/linux下线程私有数据实现原理及使用方法

 

4--- 线程池 thread_pool

  大多数的网络服务器,包括Web服务器都具有一个特点,就是单位时间内必须处理数目巨大的连接请求,但是处理时间却是比较短的。在传统的多线程服务器模型中是这样实现的:一旦有个请求到达,就创建一个新的线程,由该线程执行任务,任务执行完毕之后,线程就退出。这就是"即时创建,即时销毁"的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,  但是如果提交给线程的任务是执行时间较短,而且执行次数非常频繁,那么服务器就将处于一个不停的创建线程和销毁线程的状态。这笔开销是不可忽略的,尤其是线程执行的时间非常非常短的情况。

  线程池就是为了解决上述问题的,它的实现原理是这样的:在应用程序启动之后,就马上创建一定数量的线程,放入空闲的队列中。这些线程都是处于阻塞状态,这些线程只占一点内,不占用CPU。当任务到来后,线程池将选择一个空闲的线程,将任务传入此线程中运行。当所有的线程都处在处理任务的时候,线程池将自动创建一定的数量的新线程,用于处理更多的任务。执行任务完成之后线程并不退出,而是继续在线程池中等待下一次任务。当大部分线程处于阻塞状态时,线程池将自动销毁一部分的线程,回收系统资源。

  下面是一个简单线程池的实现,这个线程池的代码是我参考网上的一个例子实现的,由于找不到出处了,就没办法注明参考自哪里了。它的方案是这样的:程序启动之前,初始化线程池,启动线程池中的线程,由于还没有任务到来,线程池中的所有线程都处在阻塞状态,当一有任务到达就从线程池中取出一个空闲线程处理,如果所有的线程都处于工作状态,就添加到队列,进行排队。如果队列中的任务个数大于队列的所能容纳的最大数量,那就不能添加任务到队列中,只能等待队列不满才能添加任务到队列中。

  实现代码:简单Linux线程池 http://www.cnblogs.com/venow/archive/2012/11/22/2779667.html

 

转载于:https://www.cnblogs.com/chen-farsight/p/6021142.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值