POSIX线程标准:该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。Windows操作系统也有其移植版pthreads-win32。虽说现在c++11也把线程加入了标准库,但需要gcc4.8版本以上的编译器才能很好的支持,所以这里我们仍然学习posix线程标准,而且两者相差不大,学习多线程,主要是学习如何解决并发问题,如何解决多线程程序之间的同步和互斥问题。

线程概念:

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。——百度百科
学习编程最好是动手写代码,下面我会列出一些关于线程操作的api,并通过例子演示关于多线程程序如何写以及如何解决多线程程序之间的同步和互斥问题。
线程ID数据类型:pthread_t 线程属性类型:pthread_attr_t 
#include <pthread.h>
int              pthread_equal(pthread_t tid1,pthread_t tid2); //判断2个线程ID是否相同,若是返回非0数值,否则返回0
pthread_t  pthread_self(void)                                                //获得线程ID
 
线程创建
int pthread_create(pthread_t *restrict tidp,                           
         const pthread_attr_t * restrict attr,            
         void *(*start_rtn)(void *),                           
         void *restrict arg);    
                                  
创建线程,restrict关键字,表明指针所指向的内容,不能通过除此指针之外的其他直接或间接的方式修改,attr参数用来设置线程属性,一般设为NULL,创建一个具有默认属性的线程,start_rtn线程调用的函数,arg表示线程调用的函数的参数,在这个函数返回之前新线程可能已经开始运行了,创建一个线程后,也可能主线程已经结束了,新线程还没开始执行,整个进程就可能已经终止了成功返回0.
 
线程终止
void pthread_exit(void *rval_ptr);  
//终止线程,rval_ptr用来设置线程退出时的返回值,与return作用类似但有不同return不会调用清理程序,而exit会。
 
int pthred_join(pthread_t thread,void **rval_ptr);
//等待线程终止并获得线程的退出状态,rval_ptr用来获得线程退出值,若设为NULL,则只等待线程退出。注意指针指向的内存的生命周期,成功返回0
 
int pthread_cancel(pthread_t tid);                
//使用该函数表明希望线程退出,这时,被取消的线程会在某个时间,调用线程清理处理程序,就像进程退出时会调用某些函数完成清理工作
 
void pthread_cleanup_push(void (*rtn)(void *),void *arg);
 //为线程注册清理程序,在线程退出时调用,先注册的后调用,与atexit函数类似
 
void pthread_cleanup_pop(int execute);  
//取消上一个注册的清理程序一般设为0
 
在默认情况下,线程的终止状态会保存直到对该线程调用pthread_join,如果线程已经被分离,线程的底层存储资源可以在线程终止时立即被收回。在线程分离后不能调用pthread_join,可以调用pthread_detach分离线程
int pthread_detach(pthread_t tid);
代码演示
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
void cleanup(void *arg)
{
printf("cleanup: %s\n",(char *)arg);
} void *thr_fn1(void *arg)
{
printf("thread 1 start \n");
pthread_cleanup_push(cleanup,"thread 1 first handler");
pthread_cleanup_push(cleanup,"thread 1 second handler");
printf("thread 1 push complete\n");
if(arg)
return ((void *)); //这里是return,注册的清理函数不会执行 pthread_cleanup_pop();
pthread_cleanup_pop();
return ((void *));
} void *thr_fn2(void *arg)
{
printf("thread 2 start \n");
pthread_cleanup_push(cleanup,"thread 2 first handler");
pthread_cleanup_push(cleanup,"thread 2 second handler");
printf("thread 2 push complete\n");
if(arg)
pthread_exit((void *)); //这里是pthread_exit,清理函数会执行 pthread_cleanup_pop();
pthread_cleanup_pop();
pthread_exit((void *));
} int main()
{
int err;
pthread_t tid1,tid2;
void *tret;
err=pthread_create(&tid1,NULL,thr_fn1,(void *));
if(err!=)
{
perror("pthread_create");
exit(-);
} err=pthread_create(&tid2,NULL,thr_fn2,(void *));
if(err!=)
{
perror("pthread_create");
exit(-);
} err=pthread_join(tid1,&tret);
if(err!=)
{
perror("pthread_join");
exit(-);
}
printf("thread1 exit code is %ld\n",(long)tret); err=pthread_join(tid2,&tret);
if(err!=)
{
perror("pthread_join");
exit(-);
}
printf("thread2 exit coid is %ld\n",(long)tret);
exit();
}

 线程属性

Linux多线程编程——线程的创建与退出的更多相关文章

  1. Linux 多线程编程--线程退出

    今天分析项目中进程中虚存一直增长问题,运行10个小时虚存涨到121G ,RSS占用为16G 非常恐怖. Valgrind测试无内存泄漏. 内存32G 64bit系统信息如下: Linux线程使用方式是 ...

  2. LInux多线程编程----线程特定数据的处理函数

    1.pthread_key_t和pthread_key_create() 线程中特有的线程存储, Thread Specific Data .线程存储有什么用了?他是什么意思了?大家都知道,在多线程程 ...

  3. Linux多线程编程——线程的同步

    POSIX信号量 posix信号量不同于IPC中的信号量  常用的posix信号量函数   #include <semaphore.h> int sem_init(sem_t* sem,i ...

  4. LInux多线程编程----线程属性pthread_attr_t

    1.每个POSIX线程有一个相连的属性对象来表示属性.线程属性对象的类型是pthread_attr_t,pthread_attr_t 在文件/usr/include/bits/pthreadtypes ...

  5. Java多线程之线程的创建

    好久没有更博客了,最近一直在忙工作的事情.现在终于空下来了,这2天会抓紧时间整理多线程和socket,把JavaSE结束掉. 关于多线程,首先会涉及到哪些东西呢?首先要了解线程,为什么要使用线程,线程 ...

  6. Linux多线程编程初探

    Linux线程介绍 进程与线程 典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情.有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程 ...

  7. ZT 为什么pthread_cond_t要和pthread_mutex_t同时使用 || pthread/Linux多线程编程

    为什么线程同步的时候pthread_cond_t要和pthread_mutex_t同时使用 (2009-10-27 11:07:23) 转载▼ 标签: 杂谈 分类: 计算机 举一个例子(http:// ...

  8. 【操作系统作业-lab4】 linux 多线程编程和调度器

    linux多线程编程 参考:https://blog.csdn.net/weibo1230123/article/details/81410241 https://blog.csdn.net/skyr ...

  9. Linux多线程编程实例解析

    Linux系统下的多线程遵循POSIX线程接口,称为 pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.顺便说一下,Linux ...

随机推荐

  1. Longest Common Substring(最长公共子序列)

    Longest Common Substring Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...

  2. Life is a Line

    Life is a Line Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Tot ...

  3. 原生JS实现图片放大镜插件

      前  言 我们大家经常逛各种电商类的网站,商品的细节就需要用到放大镜,这个大家一定不陌生,今天我们就做一个图片放大镜的插件,来看看图片是如何被放大的…… 先看一下我们要是实现的最终效果是怎么样的  ...

  4. HDFS--笔记

    HDFS的简介 分布式的文件系统,基于流数据模式访问和处理超大文件的分布式文件系统 Hadoop Distributed File System HDFS的优点 处理超大文件 流数据访问 运行廉价的商 ...

  5. 初入WebService

    搭建webservice需要用到的jar applicationContext.xml配置文件 <?xml version="1.0" encoding="UTF- ...

  6. Android 开发笔记___登陆app

    package com.example.alimjan.hello_world; /** * Created by alimjan on 7/4/2017. */ import android.con ...

  7. html网页中加载js脚本 下载下来是乱码(文件编码格式)

    问题描述: 在一个index.html网页中,引入了jquery脚本,但是却出现错误,提示$ is not defined <!DOCTYPE html> <html lang=&q ...

  8. C++分布式实时应用框架 (Cpp Distributed Real-time Application Framework)----(一):整体介绍

    C++分布式实时应用框架 (Cpp Distributed Real-time Application Framework) 在现今软件系统纷纷"云化"的浪潮下,各种支持" ...

  9. 移动端1px 边框完整方案(四个方向)

    使用stylus(预处理) 需要一个函数接收两个参数 第一个需要在哪个方向出现边框 第二个边框颜色 $border1px(face,$color) 根据传入的方向属性,调整其他参数 l  左右方向 t ...

  10. python 小白(无编程基础,无计算机基础)的开发之路 day1

    本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...