线程的概念、创建和终止

【Linux】线程总结:初识、创建、等待、终止、分离 学习环境 :  Centos6.5 Linux 内核 2.6 Linux线程部分总结分为两部分:(1)线程的使用 ,(2)线程的同步与互斥。 第一部分线程的使用主要介绍,线程的概念,创建线程,线程退出,以及线程的终止与分离。第二部分主要介绍在多线程环境下,使用同步与互斥保护共享资源,有互斥锁,条件变量,信号量,以及读写锁。 第一部分开始 初识线程 线程:也称轻量级进程(Lightw 阅读详情

目录

1、创建线程

2、同一个进程中的多个线程共享的资源

3、线程的终止

4、等待线程结束

5、同步

6、条件变量

7、取消

8、线程与io

9、线程与信号


1、创建线程

        系统调用的最小单位
        线程标识
        pthread_t (有可能是一个结构)

        pthread_self(3);                用来返回调用线程的 ID
        pthread_equal(3);             比较两个线程标识符  

 #include <pthread.h>

 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                    void *(*start_routine) (void *), void *arg);

                pthread_t *thread,指向线程标识符的指针
                const pthread_attr_t *attr,设置线程属性
                void *(*start_routine) (void *), 线程运行函数的起始地址
                void *arg运行函数的参数
        功能:创建一个线程,在线程创建以后,就开始运行相关的线程函数

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/*
 体验多线程
 线程就是独立运行的函数
 */

static void *thr_fun(void *s)
{
	for (int i = 0; i < 20; i++) {
		write(1, "!", 1);
		sleep(1);
	}
	// pthread_exit(0);
	return (void *)0;
}

int main(void)
{
	// main线程
	pthread_t tid;

	int err = pthread_create(&tid, NULL, thr_fun, NULL);
	if (err) {
		fprintf(stderr, "pthread_create():%s\n", strerror(err));
		exit(1);
	}
	

	for (int i = 0; i < 10; i++) {
		write(1, "*", 1);
		sleep(1);
	}

	// return 0;
	pthread_exit(0);
}

2、同一个进程中的多个线程共享的资源

        共享
                pid    ppid    终端    信号行为    文件表项    环境表
                用户和组    控制终端    文件屏蔽字    记录锁
                全局数据段    进程组和会话    资源限制
        不同
                tid  栈  信号屏蔽字

3、线程的终止

                从启动例程返回
                pthread_exit(3);
                被取消

4、等待线程结束

 #include <pthread.h>

 int pthread_join(pthread_t thread, void **retval);

         以阻塞的方式等待thread指定的线程结束
        retval: 用户定义的指针,用来存储被等待线程的返回值
        线程没有返回值,又或者我们不需要接收线程的返回值,可以将 retval 参数置为 NULL

5、同步

        临界区                多线程竞争的那段代码
        互斥量                保住多线程在执行临界区代码同步

常用接口

#include <pthread.h>

int pthread_mutex_init(pthread_mutex_t *restrict mutex,
    const pthread_mutexattr_t *restrict attr);

        初始化,以动态方式创建互斥锁,参数attr指定了新建互斥锁的属性。 如果参数attr为空,则使用默认的 互斥锁 属性,默认属性为快速互斥锁 

#include <pthread.h>

int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

        pthread_mutex_lock这个操作是阻塞调用的,也就是说,如果这个锁此时正在被其它线程占用, 那么 pthread_mutex_lock () 调用会进入到这个锁的排队队列中,并会进入阻塞状态, 直到拿到锁之后才会返回。
        pthread_mutex_unlock(3);该函数用来释放互斥体引用的互斥对象。释放互斥锁的方式取决于互斥锁的类型属性。

#include <pthread.h>

int pthread_mutex_destroy(pthread_mutex_t *mutex);

        用于注销一个互斥锁

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

#define START	100
#define END		300
#define THNR	3

/*
 job > 0 已分配的数值
 job == 0 分配的数值已被任务线程取走
 job == -1 所有发放的任务已完成
 所有的线程都要存取job变量,保证同步
 */
static int job;
static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;

static int isPrimer(int n);
static void *thr_job(void *s);
int main(void)
{
	// 构建线程---》发放任务---》收尸
	pthread_t tids[THNR] = {};
	int i, err;

	for (i = 0; i < THNR; i++) {
		err = pthread_create(tids + i, NULL, thr_job, NULL);
		if (err) {
			fprintf(stderr, "pthread_create():%s\n", strerror(err));
			exit(1);
		}
	}

	for (i = START; i <= END; i++) {
		pthread_mutex_lock(&mut);
		while (job > 0) {
			// 上一次发放的任务还未被线程取走
			pthread_mutex_unlock(&mut);
			pthread_mutex_lock(&mut);
		}
		job = i;
		pthread_mutex_unlock(&mut);
	}

	// 最后一个任务被取走了。。。。job = -1 
	pthread_mutex_lock(&mut);
	while (job > 0) {
		pthread_mutex_unlock(&mut);
		pthread_mutex_lock(&mut);
	}
	job = -1;
	pthread_mutex_unlock(&mut);

	for (i = 0; i < THNR; i++)	
		pthread_join(tids[i], NULL);

	pthread_mutex_destroy(&mut);

	exit(0);
}

/*
 任务线程
 */
static void *thr_job(void *s)
{
	int num;
	// 循环取任务---》做任务(筛质数)--->终止条件job = -1
	while (1) {
		pthread_mutex_lock(&mut);
		if (job == -1) {
			pthread_mutex_unlock(&mut);
			break;
		}
		if (job == 0) {
			// 任务还未发放
			pthread_mutex_unlock(&mut);
			continue;
		}
		num = job;
		job = 0;
		pthread_mutex_unlock(&mut);

		// 以下不竞争
		if (isPrimer(num))
			printf("%d is a primer\n", num);
	
	}

	pthread_exit(0);
}

static int isPrimer(int n)
{
	for (int i = 2; i < n; i++)
		if (n % i == 0)
			return 0;
	return 1;
}

6、条件变量

        多线程在竞争资源,获取条件采用通知法

        第一步:

#include <pthread.h>

int pthread_cond_init(pthread_cond_t *restrict cond,
    const pthread_condattr_t *restrict attr);

        初始化pthread_cond_t类型的条件变量

        第二步:

#include <pthread.h>

int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond);

        pthread_cond_signal:发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.如果没有线程处在阻塞等待状态,pthread_cond_signal也会成功返回。
    pthread_cond_broadcast:函数会将所有等待该条件变量的线程解锁而不是仅仅解锁一个线程

第三步:

#include <pthread.h>

int pthread_cond_wait(pthread_cond_t *restrict cond,
    pthread_mutex_t *restrict mutex);

        阻塞等待条件变量cond
        释放已掌握的互斥锁(解锁互斥量)相当于ptherad_mutex_unlock(&mutex);
        当被唤醒,pthread_cond_wait函数返回时,解除阻塞并重新申请获取互斥锁,相当于pthread_mutex_lock(&mutex);

第四步:

int pthread_cond_destroy(pthread_cond_t *cond);

        用于销毁一个条件变量

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

#define START	100
#define END		300
#define THNR	3

/*
 job > 0 已分配的数值
 job == 0 分配的数值已被任务线程取走
 job == -1 所有发放的任务已完成
 所有的线程都要存取job变量,保证同步

 条件变量
 	pthread_cond_t
	pthread_cond_init(3)
	pthread_cond_wait(3);
	pthread_cond_signal(3) / pthread_cond_broast(3)
	pthread_cond_destroy(3);

 */
static int job;
static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

static int isPrimer(int n);
static void *thr_job(void *s);
int main(void)
{
	// 构建线程---》发放任务---》收尸
	pthread_t tids[THNR] = {};
	int i, err;

	for (i = 0; i < THNR; i++) {
		err = pthread_create(tids + i, NULL, thr_job, NULL);
		if (err) {
			fprintf(stderr, "pthread_create():%s\n", strerror(err));
			exit(1);
		}
	}

	for (i = START; i <= END; i++) {
		pthread_mutex_lock(&mut);
		// 轮询----》通知
		while (job != 0) {
			// 解锁并等待条件变化通知的到来,一旦接收到通知抢锁
			pthread_cond_wait(&cond, &mut);
		}
		job = i;
		pthread_cond_signal(&cond);
		pthread_mutex_unlock(&mut);
	}

	// 最后一个任务被取走了。。。。job = -1 
	pthread_mutex_lock(&mut);
	while (job != 0) {
		pthread_cond_wait(&cond, &mut);
	}
	job = -1;
	pthread_cond_broadcast(&cond);	
	pthread_mutex_unlock(&mut);

	for (i = 0; i < THNR; i++)	
		pthread_join(tids[i], NULL);

	pthread_mutex_destroy(&mut);
	pthread_cond_destroy(&cond);

	exit(0);
}

/*
 任务线程
 */
static void *thr_job(void *s)
{
	int num;
	// 循环取任务---》做任务(筛质数)--->终止条件job = -1
	while (1) {
		pthread_mutex_lock(&mut);
		while (job == 0) {
			// 任务还未发放
			pthread_cond_wait(&cond, &mut);
		}
		if (job == -1) {
			pthread_mutex_unlock(&mut);
			break;
		}
		num = job;
		job = 0;
		pthread_cond_broadcast(&cond);
		pthread_mutex_unlock(&mut);

		// 以下不竞争
		if (isPrimer(num))
			printf("%d is a primer\n", num);
	
	}

	pthread_exit(0);
}

static int isPrimer(int n)
{
	for (int i = 2; i < n; i++)
		if (n % i == 0)
			return 0;
	return 1;
}

7、取消

        State-->whether Type--->when
        默认state是enabled,默认的type是defferred
        pthread_cancel();
        取消点函数(man 7 pthreads)
        接受到取消请求后
                调用注册的终止处理程序
                pthread_cleanup_push(3) / pthread_cleanup_pop(3)
        线程终止

8、线程与io

         pread(3) / pwrite(3)替代read(2) / write(2)

9、线程与信号

        每一个线程都有自己的mask位图(pthread_sigmask(3))
        多线程大量与信号混用不推荐(难控制)
        多线程处理信号,专门有一个线程处理,其他线程屏蔽

线程的创建与撤销 实验目的 (1)掌握Windows系统提供的线程创建与撤销系统调用 (2)掌握Windows系统环境下线程的创建与撤销方法 2 实验准备知识 (1)线程创建 CreateThread()完成线程的创建。它在调用进程的地址空间上创建一个线程,执行指定的函数,并返回新建立线程的句柄。 原型: HANDLE CreateThread(   LPSECURITY_ATTRIBUTES lpThreadAttributes,   DWORD dwStackSize,   LPTHREAD_START_ROUTINE lpStartAddress,   LPVOID lpParameter,   DWORD dwCreationFlags,   LPDWORD lpThreadId);   参数说明:   lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。   dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。   lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:   DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。   lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。   dwCreationFlags :线程标志,可取值如下   CREATE_SUSPENDED: 创建一个挂起的线程   0 :创建后立即激活。   lpThreadId:保存新线程的id。   返回值:   函数成功,返回线程句柄;函数失败返回false。 (2)撤销线程 ExitThread()用于撤销当前线程 原型: VOID ExitThread( DWORD dwExitCode ); 参数说明: DwExitCode:指定线程返回码 返回值: 该函数没有返回值 用法举例: ExitThread(0); (3)挂起线程 Sleep()用于挂起当前正在执行的线程 原型: VOID Sleep( DWORD dwMilliseconds ); 参数说明: dwMilliseconds:指定挂起时间,单位为ms(毫秒)。 返回值: 该函数没有返回值。 (4)关闭句柄 函数CloseHandle()用于关闭已打开对象的句柄,其作用与释放动态申请的内存空间类似,这样可以释放系统资源,使进程安全运行。 原型: BOOL CloseHandle( HANDLE hObject ); 参数说明: hObject:已打开对象的句柄。 返回值: 成功,返回值为非0值;失败,则返回值为0. 立即下载

相关推荐

TI Sitara PRU可编程实时单元:工业自动化中的硬实时协处理器解析

在嵌入式系统与工业自动化领域,实时性和确定性是核心需求。实时性指系统对外部事件做出响应的可预测时间,确定性则要求响应时间严格一致,不受其他任务干扰。其技术原理通常通过专用硬件或实时操作系统实现,例如采用独立于主CPU的协处理器来处理高精度时序任务。这种设计的技术价值在于,它能将主CPU从高实时性要求的任务中解放出来,专注于复杂业务逻辑,同时确保关键IO操作达到纳秒级延迟和极低抖动。应用场景广泛覆盖伺服电机控制、工业通信协议加速和多接口扩展等。本文聚焦的TI Sitara系列PRU(可编程实时单元),正是此类

weixin_42526068的博客 284

10.线程: 创建(prhread_create)、退出(prhread_exit)、等待

LINUX线程概念以及API

lidaxia_it的博客 887

【遥感数字图像处理(朱文泉)】第四章 变换域处理方法

变换域的处理方法

甜子yu的博客 4311

【操作系统】实验一 线程的创建与撤销

实验一 一、实验目的 (1)熟悉windows系统提供的线程创建与撤销系统调用. (2)掌握windows系统环境下线程的创建与撤销方法. 二、实验准备 1.创建线程 CreateThread()函数: 在调用进程的地址空间上创建一个线程,执行指定的函数,并返回新建立的线程的句柄。 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, //为线程指定安全属性 DWORD dwStackSize, //线程堆栈的大小 LPV

晚安Alice 6487

机器学习教程 之 半监督学习 Co-training 协同训练 (论文、算法、数据集、代码)

这篇博客介绍的是一篇用于半监督分类问题的方法: 协同训练 Co-training, A. Blum and T. Mitchell, “Combining labeled and unlabeled data with co-training,” in Proc. of the 11th Annual Conf. on Computational Learning Theory, 1998.,这算是半监督领域里面始祖级的论文了,是1998年两位CMU大佬提出的方法。 之前还写过一篇关于Tri-trainin

冯良骏 的 博客 1万+

STM32_WS2811驱动

STM32的WS2811驱动

健身房 2841

Linux系统编程-线程(二):线程常用操作(pthread_*)【创建子线程(父子线程关系)、线程资源回收、分离、退出、取消】

但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。2) 如果thread线程被别的线程调用pthread_cancel异常终止掉,retval所指向的单元里存放的是常数PTHREAD_CANCELED。3) 如果thread线程是自己调用pthread_exit终止的,retval所指向的单元存放的是传给pthread_exit的参数。1) 如果thread线程通过return返回,retval所指向的单元里存放的是thread线程函数的返回值。

u013250861的博客 1812

如何将一个向量投影到一个平面上_线性代数19——投影矩阵和最小二乘

一维空间的投影矩阵  先来看一维空间内向量的投影:  向量p是b在a上的投影,也称为b在a上的分量,可以用b乘以a方向的单位向量来计算,现在,我们打算尝试用更“贴近”线性代数的方式表达。  因为p趴在a上,所以p实际上是a的一个子空间,可以将它看作a放缩x倍,因此向量p可以用p = xa来表示,只要找出x就可以了。因为a⊥e,所以二者的点积为0:  我们希望化简这个式子从而得出x:  x是一个实数...

weixin_39741101的博客 5230

线程的创建与终止

文章目录线程的三种创建方式线程的终止方式总结 线程的三种创建方式 /*使用extends Thread方式*/ class MyThread extends Thread { @Override public void run() { for (int i = 0;i<10;i++){ System.out.println(Thread.currentThread().getName()+"--"+i); } } } My

weixin_39387961的博客 445

多周期路径及set_multicycle_path详解

默认情况下,每条路径都被定义为单周期,即源触发器在时钟的任一边沿启动(launch)的数据都应该由目的触发器在时钟的下一上升沿捕获(capture)。 有的设计需要在数据被捕获前提供一些额外的周期,这类路径被称为多周期路径。 一、set_multicycle_path命令 命令格式如下: set_multicycle_path .........

Jackiezhang1993的博客 4万+

【驭风计划 机器学习】实验6 基于集成学习的 Amazon 用户评论质量预测

¶随着电商平台的兴起,以及疫情的持续影响,线上购物在我们的日常生活中扮演着越来越重要的角色。在进行线上商品挑选时,评论往往是我们十分关注的一个方面。然而目前电商网站的评论质量参差不齐,甚至有水军刷好评或者恶意差评的情况出现,严重影响了顾客的购物体验。因此,对于评论质量的预测成为电商平台越来越关注的话题,如果能自动对评论质量进行评估,就能根据预测结果避免展现低质量的评论。本案例中我们将基于集成学习的方法对 Amazon 现实场景中的评论质量进行预测。

Mege1的博客 473

【C++11多线程】线程的创建与结束:thread

1.普通函数作为线程函数 1.1 thread 1.2 join() 1.3 detach() 1.4 joinable() 2.函数对象作为线程函数 3.lambda表达式作为线程函数 4.类成员函数作为线程函数 5.向线程函数传递参数

脚踏实地,仰望星空 2870

【GlobalMapper精品教程】070:专题地图制作完整操作教程

与其它GIS软件一样,Globalmapper也可以制作出漂亮的地图,本文讲解专题地图制作完整操作流程。

智慧空间实验室 3753

Linux学习_线程的概念创建和终止

系统线程概念和实现 线程的概念 概念: 进程是资源管理的最小单位,线程是程序执行的最小单位 每个进程有自己的数据段,代码段和堆栈段。线程通常叫做轻型的进程,它包涵独立的栈和CPU寄存器状态,线程是进程的一条执行路径,每个线程共享其所附属进程的所有资源,包括打开的文件、内存页面、信号标识及动态分配的内存等。 因为线程和进程比起来很小,所以相对来说,线程花费更少的CPU资源。 在操作系统设计上,从进程演化出线程,最主要的目的就是更好地支持多处理器,并且减小进程上下文切换的开销。 进程和线程关系 线

weixin_44342705的博客 316

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

线程创建 终止

线程概念 一个进程中的所有线程都可以访问进程的组成部件,如文件描述符和内存。 不管在什么情况下,只要单个资源需要在多个用户间共享,就必须处理一致性问题。 每个线程都包含表示执行环境所必须的信息,其中包括进程中表示线程的线程ID,一组寄存器文件,栈,调度优先级和策略,信号屏蔽字,errno变量以及线程私有数据。进程的所有线程都是共享的,包括可执行代码、程序的全局内存和堆内存,打开的文件等。 P...

weixin_42238150的博客 196

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

线程的标识、创建和终止

1.线程标识 就像每个进程都有一个进程ID一样,每个线程都有一个线程ID。进程ID在整个系统中是唯一的,但线程ID只在它所属的进程环境中有效。 线程ID使用pthread_t数据类型来表示,实现的时候可以使用一个结构来表示pthread_t数据类型,所以可移植的操作系统实现不能将它比作整数处理。因此必须使用函数来对比线程ID进行比较。 #include <pthrea...

as_2014的博客 383

Linux线程创建与终止

线程概念 线程指程序的一个执行流,也可理解为是进程内部的一个控制序列,任何进程都至少含有一个线程。如下图所示: 在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体。 为了让进程完成一定的工作,进程必须至少包含一个线程。 进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源,所以我们也说,进程是

baobao1767640830的博客 398

【Linux】线程(概念、特点、线程控制代码--创建/等待/终止、分离与结合属性)

一、进程和线程 进程和线程的概念: 进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的

Amazing 469

Linux 线程(1)线程创建

1. 线程 2.

矩阵实验室 1406

Linux-线程理解,线程创建,终止,等待与分离

Linux下线程在Linux下,线程被称为轻量级进程。也就是说,Linux下是用进程模拟线程的。每一个用户态线程,在内核中都对应一个调度实体,也拥有自己的进程描述符。 在认识线程之前,一个进程对于内核中的一个进程描述符,对于一个进程id。但是现在引入线程的概念之后,情况发生了变化,一个用户进程下管辖了N个用户态线程,每个线程作为一个独立的调度实体在内核态都有自己的进程描述符,进程和内核的描述符就变

mxrrr_sunshine的博客 581

110.线程(创建、终止)

◼ 与进程(process)类似,线程(thread)是允许应用程序并发执行多个任务的一种机制。一个进程可以包含多个线程。同一个程序中的所有线程均会独立执行相同程序,且共享同一份全局内存区域,其中包括初始化数据段、未初始化数据段,以及堆内存段。(传统意义上的 UNIX 进程只是多线程程序的一个特例,该进程只包含一个线程)◼ 进程是 CPU 分配资源的最小单位,线程是操作系统调度执行的最小单位。

weixin_63779802的博客 465

线程的概念与使用

初识线程,了解Linux下线程的相关概念以及线程的创建、终止与等待,理解什么情况下才应该使用多线程

geek! 1020

线程创建、线程终止、线程等待及线程分离

线程的概念 1.什么是线程:是一个轻量级进程,一个进程内的一条执行流,也可以说是一个进程内的控制序列。 linux下PCB是线程 说的是linux操作系统,其他操作系统不是这样 linux对线程和进程不作区分,linux下的线程以进程PCB模拟 linux下的线程以进程PCB模拟,因此也叫轻量级进程(LWP) 一个进程中至少有一个线...

lvxin15353715790的博客 927

Linux多线程(线程的创建,等待,终止,分离)

在OS书籍中,线程的概念通常是这样的线程是在进程内部运行的一个执行分支(执行流),属于进程的一部分,粒度要比进程更加细,更加轻量化。通过这段话我们知道,线程与进程的比是n比1的,在其他的操作系统中,由于线程的数量较多,OS需要对线程管理起来,就会存在先描述,后组织这一方式来管理线程。但是在Linux系统下,并不是这样管理线程的。...

分享学习的知识,记录我的技术成长道路 937

操作系统:进程创建/终止/实现/线程

一、进程创建 四种原因导致创建进程: 1、系统初始化 2、执行了从事创建进程的一个系统调用,该系统调用被正在运行的进程所调用 3、用户请求创建一个进程 4、一个批处理作业的初始化 从技术上看,这些情形中,新进程都是由于一个已经存在的进程执行了一个用于创建进程的系统调用而创建的。这个已经存在的进程可以是一个运行的用户进程,一个系统进程或者一个批处理管理进程。 在UNIX中,只能有一个系统调用创建新进程,fork。这个系统调用会创建一个与调用进程相同的副本。在调用了fork后,这两个进程(父进程和

sfklyqh的博客 1876

线程的创建和终止

一、线程的概念: 1、什么是线程 (1)在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。 (2)一切进程都有一个执行线程。2、进程和线程 (1)进程是资源竞争的基本单位。 (2)线程是程序执行的最小单位。 (3)线程共享进程的数据,但也拥有自己的一部分数据:线程ID、一组寄存器、栈、errno、信号屏蔽字、调度优先级。3、一进程的多

编程鸟 1800
上一篇: 进程间通信
下一篇: 笔记—ARM体系结构与编程(汇编指令)第一天
learning_ape
博客等级 码龄4年 3粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值