进程是一个实体。每一个进程都有他自己的内存地址段(heap,stack等等)
进程是执行中的程序。
程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体。
进程是操作系统中最基本、重要的概念。
线程,又是被称为轻量级进程(Lightweight Process LWP),是程序执行的最小单元。
每一个程序都至少有一个线程,若程序只有一个线程,那么就是程序本身。
单线程的进程可以简单的认为只有一个线程的进程。
一个进程在同一时间只做一件事,有了多线程后一个进程同一时间可以做多件事。
每个线程可以处理不同的事务。
无论系统有几个CPU,即使进程运行在单CPU上,多线程也可以是进程并发处理多个事务。
一个线程阻塞不会影响到另一个线程。
多线程的进程可以尽可能的利用系统CPU资源。
但也不是线程越多越好,线程越好,CPU分配给每个线程的时间片就越少。
线程包含了表示进程内执行环境必须的信息,包括标识线程的线程ID,一组寄存器值,栈,调度优先级和策略,信号屏蔽字,errno变量以及线程私有数据,
对于内存,堆内存和代码区一般属于一个进程的,但是栈却是属于一个线程的,每个线程都拥有一个独立的栈。
errno也是属于单个线程的,每个线程中的errno是独立的。
进程内所有的信息对于线程都是共享的,包括执行代码,全局变量,和堆内存,栈以及文件描述符。
线程标识
--就像每个进程有个进程ID一样,线程也有自己的ID。
--进程ID用pid_t来表示,他是一个unsigned int.
--线程可以通过pthread_t表示,pthread_t不能把它当整数处理。
--线程可以通过pthread_self()函数获得自身的线程ID
线程创建
--在进程中只有一个控制线程
--程序开始运行的时候每个进程只有一个线程,它是以单线程方式启动的,在创建多个线程以前,进程的行为与传统的进程没有区别
--gcc在链接的时候需要增加-lpthread选项(pthread是共享库文件)。
--创建一个线程调用pthread_create函数。
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
如果pthread_create成功返回,有thread指向的内存单元被设置为新创建线程的线程ID。
attr参数用于定制各种不同的线程属性。
新创建的线程从start_routine函数地址开始执行,该函数只有一个void *参数,
如果需要向start_routine函数传递多个参数,就需要把这些参数放到一个结构中,然后把这个结构的地址作为void *传入。
线程创建的时候不能保证哪个先运行。
pthread_create函数成功返回0,失败返回非0,并且更新errno。
--注意:每个线程都拥有一份errno副本,不同的线程拥有不同的errno
//线程间的栈数据交互盲点
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <unistd.h>
#include <errno.h>
#include <pthread.h> void * func(void *arg)
{
int num=*(int *)arg;
/*
此时程序会报错,无法获取num的值
这是因为num在线程的栈内存中,arg指针本来是threadcreate()函数中a和b的指针,
但是a,b是个临时变量,在控制线程的栈内存中,当执行完threadcreate()函数之后,变量a和b就会被系统释放
此时我们在另外一个线程中取a的值就变得不可预期,因为此时a有可能已经被释放了,
解决方案:可以在进程的堆内存上创建变量a和b,这样在另一个线程中释放,就没有问题了
*/
printf("num is %d\n",num);
return NULL;
} void threadcreate()
{
pthread_t thr1,thr2;
int a=,b=;
if(pthread_create(&thr1,NULL,func,&a)!=)
{
printf("create thread failed!\n");
return;
}
if(pthread_create(&thr2,NULL,func,&b)!=)
{
printf("create thread failed!\n");
return;
}
} int main(int arg,char *args[])
{
threadcreate();
sleep();
return ;
}
.SUFFIXES:.c .o
CC=gcc
SRCS=tec01.c
OBJS=$(SRCS:.c=.o)
EXEC=tec start:$(OBJS)
$(CC) -lpthread -o $(EXEC) $(OBJS)
@echo "^_^-----OK------^_^"
.c.o:
$(CC) -Wall -g -o $@ -c $<
clean:
rm -f $(OBJS)
rm -f $(EXEC)
线程终止
--任一线程调用了exit函数,整个进程就会终止。
--如果信号默认动作是终止进程,那么信号发送到该进程,整个进程也会被终止。
单个线程通过以下三种方式退出
--线程只是从启动函数中返回,返回值是线程的退出码
--线程可以被同一进程中的其他线程取消。
--线程调用pthread_exit。
void pthread_exit(void * arg);
arg是个无类型指针,该指针会被其他线程调用pthread_join捕捉。
在线程的子函数中调用pthread_exit()函数,线程也会退出,这点跟exit()函数相同。
线程之间是异步的,无法确定哪个线程先执行。
进程内的信号捕捉一般在控制线程内进行
pthread_create()函数的第四个参数对应回调函数的参数

Linux 进程与线程一(创建-关闭线程)的更多相关文章

  1. linux进程编程:子进程创建及执行函数简介

    linux进程编程:子进程创建及执行函数简介 子进程创建及执行函数有三个: (1)fork();(2)exec();(3)system();    下面分别做详细介绍.(1)fork()    函数定 ...

  2. 【转载】查看Linux进程CPU过高具体的线程堆栈(不中断程序)

    具体的命令经常忘记,毕竟用的不是很多.为了避免去找备份一下 1.TOP命令,找到占用CPU最高的进程 $ top top - 20:11:45 up 850 days,  1:18,  3 users ...

  3. day33 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁

    今日内容: 1.线程理论 2.锁: 牺牲了效率,保证了数据的安全(重点) 3.守护线程 4.GIL锁:(重点) 5.计算密集型和IO密集型 6.信号量,事件(了解) 7.补充. 子进程中不能input ...

  4. 查看Linux进程CPU过高具体的线程堆栈(不中断程序)

    转自:http://blog.csdn.net/mergerly/article/details/47731305 1.TOP命令,找到占用CPU最高的进程 $ top top - 20:11:45  ...

  5. Java线程状态和关闭线程的正确姿势

    1.线程状态及切换 Java中的线程有六种状态,使用线程Thread内的枚举类来实现,如下,我对每个状态都进行了一定的解释. public enum State { /** 表示一个线程还没启用(即未 ...

  6. MFC 线程的创建,线程函数在类内、类外

    [线程的创建] AfxBeginThread(类外的线程函数,NULL); AfxBeginThread(类内的线程函数,(LPVOID)this); [类外线程函数] UINT 函数名(LPVOID ...

  7. 并发编程8 线程的创建&验证线程之间数据共享&守护线程&线程进程效率对比&锁(死锁/递归锁)

    1.线程理论以及线程的两种创建方法 2.线程之间是数据共享的与join方法 3.多线程和多进程的效率对比 4.数据共享的补充线程开启太快 5.线程锁 互斥锁 同步锁 6.死锁现象和递归锁 7.守护线程 ...

  8. 多线程(Thread、线程创建、线程池)

      第1章 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程 ...

  9. java基础(26):Thread、线程创建、线程池

    1. 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并 ...

随机推荐

  1. IOS 网络浅析-(八 NSURLSession简介)

    就在不长也不短的时间前,苹果正式命令咱们要向NSURLSession看,因此我们不得不认认真真的听从老大的教导,努力认知NSURLSession.其实呢,三方早已为我们解决了问题,但是呢,我们还是有必 ...

  2. Cocos2d入门--1--初涉相关属性或代码

    Cocos2d vision:  cocos2d-x-3.8.1 万丈高楼,起于累土.对于一个游戏框架的学习,其实在于框架功能的使用积累,学会了如何在cocos2d游戏引擎的基础上使用它提供的各种功能 ...

  3. LeetCode 3 Longest Substring Without Repeating Characters(最长不重复子序列)

    题目来源:https://leetcode.com/problems/longest-substring-without-repeating-characters/ Given a string, f ...

  4. DP大作战—状态压缩dp

    题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...

  5. Java基础之子类父类属性覆盖

    当java的子类和父类具有相同名字的属性时,到底java是怎么处理的. 先看代码: package com.joyfulmath.study.field; public class Person { ...

  6. .NET 反射的使用

    1.根据类名获取类实例 string className = "Company.BigProgram.BLL.TestClass"; Type type = Type.GetTyp ...

  7. 第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token

    一.access_token简介 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等, 开 ...

  8. ES5严格模式(Strict mode)

    严格模式(Strict mode)是由ECMA-262规范定义的新兴JavaScript标准,第五版发布于2009年12月.旨在改善错误检查功能并且标识可能不会延续到未来JavaScript版本的脚本 ...

  9. nyoj 139 我排第几个--康拓展开

    我排第几个 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说 ...

  10. 虚拟机centos6.5 --VirtualBox设置全屏

    一.安装以下模块 yum install kernel-devel kernel-headers gcc,然后重启. 二.安装增强功能 安装失败,查看日志文件,cat /var/log/vboxadd ...