线程基础

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

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

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

  △ 每个线程的私有这些私有资源:线程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--- 多线程编程示例

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h> char message[] = "Hello world";
void *thread_function(void *arg); int main(int argc, char *argv[])
{
pthread_t a_thread;
void *thread_result; if (pthread_create(&a_thread, NULL, thread_function, (void *)message) < ); //使用缺省属性创建线程
{
perror("fail to pthread create");
exit(-);
}
printf("waiting for thread to finish\n");
if (pthread_join(a_thread, &thread_result) < ) //等待线程结束
{
perror("fail to pthread join");
exit(-);
}
printf("MESSAGE is now %s\n", message); return ;
} void *thread_function(void *arg)
{ srtcpy(message, "marked by thread");
pthread_exit("Thank you for the cpu time");
}

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

Linux多任务编程——线程的更多相关文章

  1. Linux多任务编程之七:Linux守护进程及其基础实验(转)

    来源:CSDN  作者:王文松  转自Linux公社 ------------------------------------------------------------------------- ...

  2. Linux多任务编程之六:编写多进程程序及其代码(转)

    来源:CSDN  作者:王文松  转自Linux公社 ------------------------------------------------------------------------- ...

  3. Linux多任务编程之五:exit()和_exit()函数(转)

    来源:CSDN  作者:王文松   转自:Linux公社 ----------------------------------------------------------------------- ...

  4. Linux系统编程——线程私有数据

    在多线程程序中.常常要用全局变量来实现多个函数间的数据共享.因为数据空间是共享的,因此全局变量也为全部线程共同拥有. 測试代码例如以下: #include <stdio.h> #inclu ...

  5. linux系统编程--线程

    安装线程man page,命令:sudo apt-get install manpages-posix-dev 线程概念 什么是线程 LWP:light weight process 轻量级的进程,本 ...

  6. Linux多任务编程之一:任务、进程、线程(转)

    来源:CSDN  作者:王文松  转自:Linux公社 Linux下多任务介绍 首先,先简单的介绍一下什么叫多任务系统?任务.进程.线程分别是什么?它们之间的区别是什么?,从而可以宏观的了解一下这三者 ...

  7. Linux多任务编程——进程

    进程编程常用函数 1--- fork pitd_t fork(void); 创建一个新的子进程,其父进程为调用 fork() 函数的进程: 返回值:成功:子进程返回 0,父进程返回 子进程 PID:失 ...

  8. Linux多线程编程——线程的创建与退出

    POSIX线程标准:该标准定义了创建和操纵线程的一整套API.在类Unix操作系统(Unix.Linux.Mac OS X等)中,都使用Pthreads作为操作系统的线程.Windows操作系统也有其 ...

  9. 一步步学习Linux多任务编程

    系统调用 01.什么是系统调用? 02.Linux系统调用之I/O操作(文件操作) 03.文件描述符的复制:dup(), dup2() 多进程实现多任务 04.进程的介绍 05.Linux可执行文件结 ...

随机推荐

  1. android studio 更改快捷键为eclipse中习惯的方式

    虽然之前看了不少android studio的快捷键,但主要开发依然还是在eclipse上,仍然不习惯android studio的快捷键方式,今天看一视频说可以改快捷键为eclipse的方式,不由得 ...

  2. datagrid的基本操作-增删改

    1 ---恢复内容开始--- <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  3. Redhat修改本地yum源

    1.将Centos系统的ios文件传到服务器,比如传到/root目录下: 2.将ios文件挂载到本地,需要在本地建立一个文件夹,比如/yum; mkdir /yum mount -o loop /ro ...

  4. uva 352 - The Seasonal War

    題意: 要確認畫面中有幾隻Eagles,每個pixel如果是'1'代表為一隻Eagles,但上下左右(包含斜角共8個方向)相連的'1'只能算是同一隻. 想法: 使用DFS找'1'有幾個區域. #inc ...

  5. jQuery1.9(辅助函数)学习之——.serialize();

    $("form").serialize();  返回一个String 描述: 将用作提交的表单元素的值编译成字符串,这个方法不接受任何参数. .serialize(); 方法使用标 ...

  6. Java并发编程与技术内幕:线程池深入理解

    摘要: 本文主要讲了Java当中的线程池的使用方法.注意事项及其实现源码实现原理,并辅以实例加以说明,对加深Java线程池的理解有很大的帮助. 首先,讲讲什么是线程池?照笔者的简单理解,其实就是一组线 ...

  7. CentOS 5上Apache配置虚拟主机范例

    昨天实践了下在CentOS 5上通过Apache直接配置虚拟主机,服务器没有安装面板软件,所以只能通过SSH远程连接操作了.Apache安装在/etc/httpd目录下,这个即是Apache的根目录, ...

  8. Visual Studio的广告剧

    一个热衷于code的developer,一个热衷于developer的girl,他们将发生怎样的故事? 第一集:<想做你的Code> 第二集:<让爱延长> 第三集:<幸福 ...

  9. memcached学习笔记——连接模型

    文章链接:http://www.hcoding.com/?p=121 个人站点:JC&hcoding.com memcached是什么呢?memcached是一个优秀的.高性能的内存缓存工具. ...

  10. div 居中进行总结

    1.margin:auto ;让元素居中,需要确定元素的宽度,并且需要是块元素 eg: div { width:200px; height:200px; background:#222; margin ...